Assoc Array 需要 Bash 4 以上.一般 Linux 都可以

所谓的关联数组 (Associative Array) 其实就是字典,但是其 key 只能是字符串.用 declare -A 声明,下面记录一些常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 声明一个空的关联数组
declare -A assoc
# 声明有初值的关联数组,语法:[key]=value,空格隔开
declare -A assoc=(["key1"]="v1" ["key2"]="v2")

# 赋值,不存在的 key 会返回空字符串
assoc["/home"]=2
assoc["/login"]=1
assoc["user id"]=13

# 所有 key,对应 Python dict.keys()
"${!assoc[@]}" # 注意,为了 for-loop 可以正常遍历,别忘了引号

# 所有 values,对应 Python dict.values()
"${assoc[@]}"

# 元素数量
"${#assoc[@]}"

# 删除元素
unset 'assoc["/login"]'

# 判断 key 是否存在
[[ -v 'assoc["/login"]' ]] && echo "exists"

简单应用:计数器

Associative Array 可以很方便地拓展成计数器:

1
2
3
4
5
declare -A cnt

while IFS= read -r key; do
((cnt["$key"]++)) # 这里的两个圆括号包裹的表达式会被 Bash 当作数学表达式进行计算.
done