Bash从4.0版本开始引入关联数组。

关联数组允许你使用非整型下表索引数组中的元素,类似于Perl中的哈希数组或者Python中的字典。Bash要求关联数组的键是唯一的,而值可以不唯一,在Bash内部键与值是一一对应的(即使有多个相同的值也是如此)。使用关联数组前应该先申明变量类型为关联数组类型:

bash_4.1 $ declare -A dict


然后就可以像使用普通数组一样使用它了:

bash_4.1 $ dict['a']=123
bash_4.1 $ dict['b']=123
bash_4.1 $ declare -p dict
declare -A dict='([a]="123" [b]="123" )'


如果不声明关联数组的话,你得到的将是一个普通数组:

bash_4.1 $ odict['a']=3
bash_4.1 $ declare -p odict
declare -a odict='([0]="3")'


那么如何像Perl和Python中那样,轻松愉快地获取Bash中关联数组的键或者值呢?我相信绝大多数人刚开始学习SEHLL编程时,都会为它蹩脚语法感到困惑,但是正是因为这些丑陋但却实用的语法,往往可以在我们脚本编程中成为解决某个问题出奇制胜的方法。Bash中关联数组的操作方法如下:

bash_4.1 $ declare -A dict=([A]=123 [B]=456 [C]=789)
bash_4.1 $ echo ${!dict[*]}    # 取关联数组所有键
A B C
bash_4.1 $ echo ${!dict[@]}    # 取关联数组所有键
A B C
bash_4.1 $ echo ${dict[*]}     # 取关联数组所有值
123 456 789
bash_4.1 $ echo ${dict[@]}     # 取关联数组所有值
123 456 789
bash_4.1 $ echo ${#dict[*]}    # 取关联数组长度
3
bash_4.1 $ echo ${#dict[@]}    # 取关联数组长度
3
bash_4.1 $


遍历一个关联数组可以用下面的方法:

bash_4.1 $ declare -A dict=([bash]='4.1' [mysql]='5.5.29' [php]='5.2.17' [nginx]='1.15')
bash_4.1 $ for lang in ${!dict[@]}; do printf "%-5s: %-6s\n" $lang ${dict[$lang]}; done
nginx: 1.15 
bash : 4.1  
php  : 5.2.17
mysql: 5.5.29
bash_4.1 $