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