背景
在大部分的编程语言中都支持 “键值对” 的这种数据结构,比如: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
3echo ${userInfo[@]}
echo ${userInfo[*]}
# => tom 8获取所有元素的下标(两种方式结果相同)
1
2
3echo ${!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
6for key in ${!userInfo[@]}
do
echo "${key} -> ${userInfo[$key]}"
done
# => name -> tom
# => age -> 8