Есть ли "заданная" структура данных в 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]