在不同的編程語言中,字典通常有不同的名稱,例如關(guān)聯(lián)數(shù)組、hashmap 或映射。在本文中,將演示如何在 bash 中使用鍵值字典。以下使用 shell 腳本示例來說明字典的詳細(xì)用法。
聲明字典變量
在字典中,字典存儲(chǔ)一組鍵,每個(gè)鍵都有一個(gè)與之關(guān)聯(lián)的值??梢允褂脤?duì)應(yīng)的鍵在字典中插入、檢索或更新值。字典數(shù)據(jù)結(jié)構(gòu)針對(duì)基于鍵值的快速檢索進(jìn)行了優(yōu)化,因此通常使用哈希表來實(shí)現(xiàn)。在不同的編程語言中,字典通常有不同的名稱,例如關(guān)聯(lián)數(shù)組、hashmap 或映射。在本文中,將演示如何在 bash 中使用鍵值字典。以下使用 shell 腳本示例來說明字典的詳細(xì)用法。
聲明字典變量
使用declare -A命令顯式聲明字典。
[root@localhost ~]# declare -A test_var
字典中添加鍵值對(duì)
如果需要在字典中添加鍵值對(duì),使用下面命令操作:
[root@localhost ~]# declare -A dic
# 添加方式一
[root@localhost ~]# dic=([key1]="value1" [key2]="value2" [key3]="value3")
# 添加方式二
[root@localhost ~]# dic[key4]=value4
# 添加方式三,使用變量添加鍵值對(duì)
[root@localhost ~]# var_key1=key5
[root@localhost ~]# var_value1=value5
[root@localhost ~]# dic[$var_key1]=$var_value1
從字典中檢索鍵值對(duì)
使用下面方式通過鍵的名稱獲取值:
[root@localhost ~]# echo ${dic[key1]}
value1
[root@localhost ~]# echo ${dic[$var_key1]}
value5
更新字典中的現(xiàn)有鍵值
更新現(xiàn)有鍵的值與插入新的鍵值對(duì)沒有什么不同。通過更新,現(xiàn)有值會(huì)被新值覆蓋。
[root@localhost ~]# dic[key1]='puppy'
[root@localhost ~]# echo ${dic[@]}
value5 value4 value3 value2 puppy
可以看到key1的值被改成 puppy了。

檢查字典中是否存在鍵
如果想檢查一個(gè)鍵是否存儲(chǔ)在字典中??梢酝ㄟ^檢查是否設(shè)置了值來測(cè)試字典中鍵的存在(在條件中使用 -v 運(yùn)算符)。
[root@localhost ~]# if [ -v dic[key1] ];then echo 'key1 exists in dic';fi
key1 exists in dic
[root@localhost ~]# if [ ! -v dic[key6] ];then echo 'key6 does not exists in dic';fi
key6 does not exists in dic

從字典中刪除鍵值對(duì)
可以通過使用 unset 語句指定鍵,從字典中刪除現(xiàn)有的鍵值對(duì)。
[root@localhost ~]# unset dic[key1]
[root@localhost ~]# unset dic[$var_key1]
[root@localhost ~]# echo ${dic[@]}
value4 value3 value2
可以看到結(jié)果key1和key5的鍵值都刪掉了

遍歷字典
另一個(gè)常用的功能是遍歷,使用${!dic[@]}來獲取所有的鍵名稱,使用${dic[@]}來獲取所有的值。遍歷存儲(chǔ)在字典中的所有鍵值對(duì)并執(zhí)行一些操作:
[root@localhost ~]# vim dic_for.sh
[root@localhost ~]# cat dic_for.sh
#!/bin/bash
declare -A dic
dic=([key1]="value1" [key2]="value2" [key3]="value3")
for key in "${!dic[@]}"
do
echo "$key - ${dic[$key]}"
done
[root@localhost ~]# sh dic_for.sh
key3 - value3
key2 - value2
key1 - value1
