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的方法真是够笨的 -。-!

猜你喜欢

转载自blog.csdn.net/weixin_42651205/article/details/83624574