在Bash中,我可以使用这种常见结构创建地图(哈希表)
hput() {
eval "$1""$2"='$3'
}
hget() {
eval echo '${'"$1$2"'#hash}'
}
然后像这样使用它:
hput capitals France Paris
hput capitals Spain Madrid
echo "$(hget capitals France)"
但是如何最好地迭代地图中的条目?例如,在Java中我会这样做:
for (Map.Entry<String, String> entry : capitals.entrySet()) {
System.out.println("Country " + entry.getKey() + " capital " + entry.getValue());
}
是否有一种在Bash中完成类似内容的常用方法?
答案 0 :(得分:11)
如果你有bash 4.0,你可以使用associative arrays。否则你可以使用awk
个关联数组
答案 1 :(得分:3)
这是一种方法:
for h in ${!capitols*}; do indirect=$capitols$h; echo ${!indirect}; done
这是另一个:
for h in ${!capitols*}; do key=${h#capitols*}; hget capitols $key; done
另一个:
hiter() {
for h in $(eval echo '${!'$1'*}')
do
key=${h#$1*}
echo -n "$key "
hget $1 $key
done
}
hiter capitols
France Paris
Spain Madrid
顺便说一句,“国会大厦”是一座建筑物。一个城市被称为“资本”。
答案 2 :(得分:1)
hkeys() {
set | grep -o "^${1}[[:alnum:]]*=" | sed -re "s/^${1}(.*)=/\\1/g"
}
for key in $(hkeys capitols) ; do
echo $key
done
你的hget功能错了。试试这个:
hput capitols Smth hash
hget capitols Smth
第二个命令应该返回字符串哈希,但它什么也没有返回。从你的函数中删除«#hash»字符串。
此外,echo "$(hget capitols France)"
是暧昧的。您可以改为使用hget capitols France
。