shell的map簡單的新增、查詢、刪除、遍歷
阿新 • • 發佈:2018-11-22
想建立一個類似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的方法真是夠笨的 -。-!