bash中是否有“set”数据结构?

时间:2011-08-17 21:42:01

标签: bash set

Python有一个“set”类型,它包含唯一的对象。 Bash有同等的东西吗?

我想继续向这样的bash“set”添加元素,并且永远不会有重复。

3 个答案:

答案 0 :(得分:13)

Bash 4.0具有关联数组,可用于构建集。

讨论它们的

Here's an article(这是Google首次针对“bash关联数组”的搜索)。

(就个人而言,我只使用bash以外的东西,可能是Perl。)

答案 1 :(得分:9)

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中,没有关联数组可用

答案 2 :(得分:3)

经过一些谷歌搜索后,我在http://www.catonmat.net/blog/set-operations-in-unix-shell-simplified/找到了一个很好的bash实现。它以多种方式拥有所有常用的操作符,甚至是可打印的pdf cheatsheet。

我使用了关联数组,但它更具可读性。

声明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]