0%

Shell关联数组

背景

​ 在大部分的编程语言中都支持 “键值对” 的这种数据结构,比如:Python中的dict、Java中的HashMap等等。对于Shell中实际也是存在类似的这种用法,也就是 “Shell关联数组“。

​ 刚好最近在写Shell脚本的时候使用了该功能,便进行相关使用方法以及注意点的记录。

常用方式

初始化 & 访问元素

1
2
3
4
5
6
7
8
9
declare -A userInfo
declare userInfo
userInfo["name"]="tom"
userInfo["age"]=8

echo ${userInfo["name"]}
# => tom
echo ${userInfo["age"]}
# => 8

⚠️ 注意事项:

问题1: declare -A userInfo 初始化关联数组的方式在本地MAC上不可用。

原因declare -A Shell关联数组的用法是在 Bash 4+ 的功能,我本地MAC的 Bash版本是 3.X。

1
2
xxx@xxxMacBook-Pro:~$ echo ${BASH_VERSION}
3.2.57(1)-release

解决方法可以参考:MAC 升级bash(本人未实践,仅供参考)

问题2: 部分网页在访问元素时使用 () 的方式,此方法会报错。应该使用 {}。
1
2
3
4
5
6
[root@2fba7896990f ~]# echo $(userInfo["name"])
-bash: userInfo[name]: command not found

# 解决办法:
[root@2fba7896990f ~]# echo ${userInfo["name"]}
tom

删除元素

1
2
3
4
5
6
7
declare -A userInfo
userInfo["name"]="tom"
echo ${userInfo["name"]}
# => tom
unset userInfo["name"]
echo ${userInfo["name"]}
# => 无结果

⚠️ 注意事项:

问题3: 获取关联数组的值时,未使用 {},返回结果错误。

由于Shell中的变量实际可以不使用{},比如以下代码输出的结果是一致的。

1
2
3
a="test"
echo $a
echo ${a}

但在使用关联数组获取对应key的值时候,必须带{}。否则输出结果异常。具体实例如下:

1
2
3
4
5
6
declare -A userInfo
userInfo["name"]="tom1"
echo $userInfo["name"]
# => [name]
echo ${userInfo["name"]}
# => tom1

其他

  • 获取所有元素的值(两种方式结果相同)

    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

参考链接

------------- 本 文 结 束 感 谢 您 的 阅 读 -------------