1. 程式人生 > >shell的map簡單的新增、查詢、刪除、遍歷

shell的map簡單的新增、查詢、刪除、遍歷

想建立一個類似map的key——value集合
搜了下shell有沒有map,倒是搜到了declare -A mymap,需要sh版本支援(>=version 4.1.2),只不過介紹很少,基本就是定義、新增、取值、遍歷、沒有看到查詢,迭代這類的用法,介紹的用法也是當成陣列來用,只不過支援陣列下標自定義,把下標當成map的key來使用。
這裡用到eval,不然我不知道怎麼用awk給map賦值,之所以寫成邊處理字串或者文字邊賦值是考慮到實際使用的時候,我們都是在處理的過程中需要把處理得到的key和value賦值給map,而不是千篇一律的寫個for迴圈map[key]=value,那樣只能做已知的迴圈遍歷處理,至於查詢,用grep笨方法,但是功能上實現了基本的map集合的功能,不知是不是shell的map自帶查詢、迭代的用法,反正我沒找到,也沒想法去翻原始碼,畢竟我的需求只是處理些不是特別大的測試用的配置文字,不然就用python來寫了

vim test.txt
key1:value1
key2:value2
key3:value3
key4:value4
key5:value5

#!/bin/bash  
str=(`cat ./test.txt | awk -F ' ' '{print $1}'`)
declare -A mymap;
for i in ${!str[@]}
do
eval $(echo ${str[i]} | awk '{split($0, filearray, ":");print "mymap["filearray[1]"]="filearray[2]}')
done
#輸出所有key值
echo ${!mymap[@]}
#輸出所有value值
echo ${mymap[@]}
for key in ${!mymap[@]}
do
echo "${scanMap[$key]}"
done

#查詢和刪除
findkey="keyx"
value="valuex"
if echo "${!mymap[@]}" | grep -w "$findkey" &>/dev/null
then
	echo "find value"
	unset mymap[$findkey]
else
	mymap[$findkey]=$value
fi

寫完後忽然想到查詢直接用

echo ${scanMap[$findkey]}

不就解決了?c++的思維束縛了,grep的方法真是夠笨的 -。-!