Bash:迭代Map的正确方法

时间:2010-04-10 23:10:14

标签: bash map hashtable iteration

在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中完成类似内容的常用方法?

3 个答案:

答案 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