bash中是否有"set"数据结构?

McB*_*den 15 bash set

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

我想继续添加元素到这样的bash"set",并且永远不会有重复.

Kei*_*son 13

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

这是一篇讨论它们的文章(它是第一个针对"bash关联数组"的谷歌搜索).

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


vak*_*vak 10

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

aa b c
Run Code Online (Sandbox Code Playgroud)

同样在bash 3中,没有关联数组可用

  • 谢谢!您还可以简化:`uniques=($(for v in "${some_dups[@]}"; do echo "$v";done| sort -u))` (3认同)

Pau*_*ias 7

经过一番谷歌搜索后,我在http://www.catonmat.net/blog/set-operations-in-unix-shell-simplified/找到了一个不错的 bash 实现。它以多种方式拥有所有常用的集合运算符,甚至是可打印的 pdf 备忘单。

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

声明一个setA关联数组变量:

$ declare -A setA
Run Code Online (Sandbox Code Playgroud)

或者同时声明并添加初始成员:

$ declare -A setA=([memberA]=1 [memberB]=1)
Run Code Online (Sandbox Code Playgroud)

向集合中添加成员:

$ setA[memberC]=1
Run Code Online (Sandbox Code Playgroud)

会员测试:

$ [ -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
Run Code Online (Sandbox Code Playgroud)

列表成员(空格分隔):

$ echo "${!setA[@]}"
memberA memberC memberB
Run Code Online (Sandbox Code Playgroud)

或(换行符分隔):

$ printf '%s\n' "${!setA[@]}"
memberB
memberC
memberA
Run Code Online (Sandbox Code Playgroud)

遍历成员:

$ for m in "${!setA[@]}"; do echo "$m"; done
memberB
memberC
memberA
Run Code Online (Sandbox Code Playgroud)

基数(集合中的成员数):

$ echo ${#setA[@]}
3
Run Code Online (Sandbox Code Playgroud)

删除成员:

$ unset setA[memberC]
Run Code Online (Sandbox Code Playgroud)

使用引号添加名称中带有空格的成员:

$ setA["member with space"]=1
Run Code Online (Sandbox Code Playgroud)

也可以使用变量作为成员:

$ read -r str
$ setA["$str"]=1
Run Code Online (Sandbox Code Playgroud)