Skip to content

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
value3

3.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 1

3.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 value2

3.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 : value2

3.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。