Вы можете использовать comm
для этого:
readarray -t unique < <( \
comm -23 \
<(printf '%s\n' "${list1[@]}" | sort) \
<(printf '%s\n' "${list2[@]}" | sort) \
)
, что приводит к
$ declare -p unique
declare -a unique=([0]="101" [1]="102" [2]="103" [3]="104")
или, чтобы получить желаемый формат,
$ printf '(%s)\n' "${unique[*]}"
(101 102 103 104)
comm -23
берет два отсортированных файла (здесь используется sort
) и печатает каждую строку, уникальную для первой; процесс подстановки используется для подачи списков в comm
.
Затем readarray
считывает выходные данные и помещает каждую строку в элемент unique
массив.(Обратите внимание, что для этого требуется Bash.)
Ваша попытка не удалась, среди прочего, потому что вы пытались сравнить несколько элементов в одном сравнении:
[[ ${list1[@]} != ${list2[@]} ]]
расширяется до
[[ 10 20 30 40 50 60 90 100 101 102 103 104 != 10 20 30 40 50 60 70 80 90 100 ]]
и Bash жалуется на бинарный оператор, ожидаемый вместо второго элемента, 20
.