bash的字典---关联数组

python中存在一种叫做字典的数据类型,字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值 key:value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {},格式如下所示:

1
d = {key1 : value1, key2 : value2 }

关联数组的定义

shell中称为关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。关联数组使用 declare 命令来声明,语法格式如下:

1
declare -A array_name

-A选项就是用于声明一个关联数组。关联数组的键是唯一的。以下实例我们创建一个关联数组 site,并创建不同的键值:

实例
1
declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")

我们也可以先声明一个关联数组,然后再设置键和值:

实例
1
2
3
4
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

关联数组的访问

访问关联数组元素可以使用指定的键,格式如下:

实例
1
2
3
4
5
6
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo ${site["runoob"]}

执行脚本,输出结果为:

result
1
www.runoob.com

对于一些不确定的大量数组,我们可以直接使用默认的编号方式赋值或取出结果,然后可以用循环来处理每一条记录。但是对于某些数量有限,且有一些特意义的情况使用关联数组可以大大提高程序的可读性。例如,我们需要在系统中检测一下是否存在命令unar, 如果不存在则安装程序,但是程序的名称却是unarchiver, 因此可以定义一个关联数组解决:

实例
1
2
3
declare -A cmd
cmd["unar"]="unarchiver"
sudo pacman -S ${cmd["unar"]}

在不同的系统中存在不同的软件包管理器,此时可以通过定义关系数组来实现统一的管理脚本程序。

关联数组的特殊值

关联数组的特殊值
1
2
3
4
5
6
7
8
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo ${#site[*]} #输出数组的元的个数(大小)
echo ${!site[*]} #输出全部的键名
echo ${site[*]} #输出全部的值

注意:上述echo中的*可以替换成@,效果等价。