2010-06-24 67 views
224

基於Bash腳本中的關聯數組,我需要迭代它以獲取鍵和值。如何遍歷Bash中的關聯數組

#!/bin/bash 

declare -A array 
array[foo]=bar 
array[bar]=foo 

我其實不知道如何同時使用for-in循環拿到鑰匙。

+6

$聲明-A陣列=([富] =巴[巴] = FOO)#初始化所有在一次 – anisbet 2014-01-24 16:26:30

+2

對於一個關鍵值的小列表,你可能會考慮這個:'for i in a,b c_s,d;做KEY = $ {i%,*}; VAL = $ {I#*,}; echo $ KEY「XX」$ VAL;完成 - 謝謝! – math 2014-05-16 14:45:36

回答

400

的密鑰使用感嘆號訪問:${!array[@]}中, 使用${array[@]}訪問。

可以遍歷這樣的鍵/值對:

for i in "${!array[@]}" 
do 
    echo "key : $i" 
    echo "value: ${array[$i]}" 
done 

注意在for語句中使用引號周圍的變量(加上使用@代替*)。如果任何鍵包含空格,這是必要的。

在其他答案的混亂來自一個事實,即你的問題都包含了鍵值「foo」和「酒吧」。

+2

現在,如果將所有鍵分配給一個數組:'array =($ {!hash [@]})' – 2013-06-06 10:54:41

+7

@ Michael-O:您需要引用參數擴展來保護可能有空白的鍵:'array =(「$ {!hash [@]}」) – 2014-05-22 17:05:42

+0

@DennisWilliamson,非常感謝。我沒有想到這一點。 – 2014-05-23 07:07:04

35

您可以${!array[@]}訪問鍵:

bash-4.0$ echo "${!array[@]}" 
foo bar 

然後,遍歷鍵/值對很簡單:

for i in "${!array[@]}" 
do 
    echo "key :" $i 
    echo "value:" ${array[$i]} 
done 
+0

完美 - 謝謝! – pex 2010-06-24 19:10:36

+1

我有「!」 - 甚至沒有注意到,沒有,對不起.. :) – pex 2010-06-25 00:59:38

4

使用此高階函數以防止pyramid of doom

foreach(){ 
    arr="$(declare -p $1)" ; eval "declare -A f="${arr#*=}; 
    for i in ${!f[@]}; do $2 "$i" "${f[$i]}"; done 
} 

例如:

$ bar(){ echo "$1 -> $2"; } 
$ declare -A foo["flap"]="three four" foo["flop"]="one two" 
$ foreach foo bar 
flap -> three four 
flop -> one two 
+1

我不確定這是如何適用的?厄運的金字塔不是一個純粹的美學問題,只能用於面向對象的語言? – 2017-08-02 20:44:37

+1

你能解釋一下嗎? foreach函數有點棘手。我不明白。 – 2018-02-09 10:52:27