Есть ли "заданная" структура данных в bash?

Python имеет тип "set", который содержит уникальные объекты. Имеет ли Bash что-то эквивалентное?

Я хочу добавить элементы к такому Bash "набору" и никогда не иметь дубликатов.

Ответ 1

Bash 4.0 имеет ассоциативные массивы, которые можно использовать для сборки наборов.

Здесь описывается статья (это был первый хит Google для "bash ассоциативных массивов" ).

(Лично я бы использовал только что-то, кроме bash, возможно, Perl.)

Ответ 2

some_dups=(aa aa b b c)
uniques=($(for v in "${some_dups[@]}"; do echo "$v";done| sort| uniq| xargs))
echo "${uniques[@]}"

дает

aa b c

также в bash 3, где нет ассоциативных массивов

Ответ 3

После некоторого googling я нашел хорошую реализацию bash в http://www.catonmat.net/blog/set-operations-in-unix-shell-simplified/. Он имеет все обычные операторы множеств несколькими способами и даже печатаемый pdf-код.

Я использовал ассоциативные массивы, но это гораздо читаемо.

Объявить переменную ассоциативного массива setA:

$ declare -A setA

Или объявить и добавить исходные элементы одновременно:

$ declare -A setA=([memberA]=1 [memberB]=1)

Добавьте элемент в набор:

$ setA[memberC]=1

Тест для членства:

$ [ -n "${setA[memberC]}" ] && echo in set || echo not in set
in set

$ [ -n "${setA[memberD]}" ] && echo in set || echo not in set
not in set

Список участников:

$ for m in "${!setA[@]}"; do echo $m; done
memberB
memberC
memberA

или

$ printf '%s\n' "${!setA[@]}"
memberB
memberC
memberA

Мощность (количество членов в наборе):

$ echo ${#setA[@]}
3

Удалить участника:

$ unset setA[memberC]