LV030-字典
一、字典
在shell中是支持字典的,字典就是键值对,就类似这种样子的
shell
"key"="value"字典,在其他语言中也称 map,使用 键-值对(key-value)存储,查找速度快。字典是无序的对象集合,元素是通过键来存取的,而不是通过索引值存取。字典是可变数据类型。
1. 字典的定义
声明字典类型要用到关键词 declare :
shell
declare -A dict_name这里一定要-A来声明,-a只能用来声明数组类型。需要注意的是在shell中变量可以不声明直接使用,但是字典不行,字典必须先声明,再使用。
2. 字典赋值
我们有两种赋值方式:
shell
# 1.定义时直接赋值
declare -A dict
dict=([key1]="value1" [key2]="value2" [key3]="value3")
# 2.动态赋值
declare -A dict
dict['key']=value注意:
(1)如果键值对已经存在,会覆盖之前的值。
(2)key可以是数字或字符串。
3. 字典相关操作
3.1 打印指定key的value
- 使用格式
shell
echo ${dict_name[key]}- 使用实例
shell
#!/bin/sh
declare -A dict
dict=([0]="value1" [1]="value2" ["a"]="value3")
echo ${dict[0]}
echo ${dict[1]}
echo ${dict["a"]}打印结果如下:
shell
hk@vm:~/1sharedfiles/6temp/STM32$ ./2.sh
value1
value2
value33.2 打印所有key
- 使用格式
shell
echo ${!dict_name[*]}
echo ${!dict_name[@]}- 使用实例
shell
#!/bin/sh
declare -A dict
dict=([0]="value1" [1]="value2" ["a"]="value3")
echo ${!dict[*]}打印结果如下:
shell
hk@vm:~/1sharedfiles/6temp/STM32$ ./2.sh
a 0 13.3 打印所有value
- 使用格式
shell
echo ${dict_name[*]}
echo ${dict_name[@]}- 使用实例
shell
#!/bin/sh
declare -A dict
dict=([0]="value1" [1]="value2" ["a"]="value3")
echo ${dict[*]}打印结果如下:
shell
hk@vm:~/1sharedfiles/6temp/STM32$ ./2.sh
value3 value1 value23.4 遍历
- 使用实例
shell
#!/bin/sh
declare -A dict
dict=([0]="value1" [1]="value2" ["a"]="value3")
echo ${dict[*]}
for key in ${!dict[*]}
do
echo "${key} : ${dict[${key}]}"
done打印结果如下:
shell
hk@vm:~/1sharedfiles/6temp/STM32$ ./2.sh
value3 value1 value2
a : value3
0 : value1
1 : value23.5 不声明?
- 使用实例
shell
#!/bin/sh
#declare -A dict
dict=([0]="value1" [1]="value2" ["a"]="value3")
echo ${!dict[*]}
for key in ${!dict[*]}
do
echo "${key} : ${dict[${key}]}"
done打印结果如下:
shell
hk@vm:~/1sharedfiles/6temp/STM32$ ./2.sh
0 1
0 : value3
1 : value2发现我的 “a” 呢?怎么没了,原因就在于没了字典的声明,这样看上去就是一个数组了,数组是不支持字符串下标的,所以就没有a啦,这一点需要注意一下。
我们可以试一下数组支不支持字符下标:
shell
#!/bin/sh
#declare -A dict
dict=(["a"]="value_a" ["b"]="value_b")
echo ${dict[@]}打印结果如下:
shell
hk@vm:~/1sharedfiles/6temp/STM32$ ./2.sh
value_b最终的结果就是数组里面只有下标 为 0 的值为 value_b。