背景
 在大部分的编程语言中都支持 “键值对” 的这种数据结构,比如:Python中的dict、Java中的HashMap等等。对于Shell中实际也是存在类似的这种用法,也就是 “Shell关联数组“。
 刚好最近在写Shell脚本的时候使用了该功能,便进行相关使用方法以及注意点的记录。
常用方式
初始化 & 访问元素
| 1 | declare -A userInfo | 
⚠️ 注意事项:
问题1: declare -A userInfo 初始化关联数组的方式在本地MAC上不可用。
原因:declare -A Shell关联数组的用法是在 Bash 4+ 的功能,我本地MAC的 Bash版本是 3.X。
| 1 | xxx@xxxMacBook-Pro:~$ echo ${BASH_VERSION} | 
解决方法可以参考:MAC 升级bash(本人未实践,仅供参考)
问题2: 部分网页在访问元素时使用 () 的方式,此方法会报错。应该使用 {}。
| 1 | [root@2fba7896990f ~]# echo $(userInfo["name"]) | 
删除元素
| 1 | declare -A userInfo | 
⚠️ 注意事项:
问题3: 获取关联数组的值时,未使用 {},返回结果错误。
由于Shell中的变量实际可以不使用{},比如以下代码输出的结果是一致的。
| 1 | a="test" | 
但在使用关联数组获取对应key的值时候,必须带{}。否则输出结果异常。具体实例如下:
| 1 | declare -A userInfo | 
其他
- 获取所有元素的值(两种方式结果相同) - 1 
 2
 3- echo ${userInfo[@]} 
 echo ${userInfo[*]}
 # => tom 8
- 获取所有元素的下标(两种方式结果相同) - 1 
 2
 3- echo ${!userInfo[@]} 
 echo ${!userInfo[*]}
 # => name age
- 判断元素是否存在 - 1 
 2
 3
 4- # 判断 "name" 的key值存在 
 if [[ -n "${userInfo['name']}" ]]; then
 echo "key: name exist"
 fi
- 遍历所有键值并输出 - 1 
 2
 3
 4
 5
 6- for key in ${!userInfo[@]} 
 do
 echo "${key} -> ${userInfo[$key]}"
 done
 # => name -> tom
 # => age -> 8
