2010-04-10 52 views
4

在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中完成類似事情的常見方法?

回答

10

如果你有bash 4.0,你可以使用associative arrays。否則,您可以利用awk小號關聯數組

+0

我在Bash 3上,所以awk解決方案看起來比我自己的更好。謝謝。 – 2010-04-11 10:16:23

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)"是ambigious。您可以改用hget capitols France

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 

由方式,「國會大廈」是一個建築物。一個城市被稱爲「首都」。

+0

謝謝修正拼寫 – 2010-04-11 10:07:23