2012-11-09 383 views
6

我有一個關聯數組的變量列表,我想要遍歷並檢索它們的鍵/值對。Bash腳本 - 通過關聯數組列表遍歷「變量」變量名

我遍歷單個關聯數組,通過列出所有的鍵和獲取值,即。

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

棘手的部分是關聯數組的名稱是變量變量,例如,給定count = 5,關聯數組將被命名爲queue1,queue2,queue3,queue4,queue5。

我想基於計數來替換上面的序列,但到目前爲止,括號和eval的每個組合都沒有產生多得多的錯誤替代錯誤。例如:

for count in {1,2,3,4,5} do 
    for key in "${!queue${count}[@]}" do 
     echo "key : $key" 
     echo "value : ${queue${count}[$key]}" 
    done 
done 

幫助將非常感激!

+0

現有答案是很大程度上外的日期中的在bash 4.3 namevar支持的上下文(然後)。 –

回答

3

這裏的困難源於間接擴展的語法(${!nameref})與用於從關聯數組中提取密鑰的語法衝突(${!array[@]})。我們只能有一個或另一個,而不是兩個。

警惕,因爲我關於使用eval,我看不到的方式使用它周圍的提取間接引用關聯數組的鍵:

keyref="queue${count}[@]" 
for key in $(eval echo '${!'$keyref'}'); do ... ; done 

但是,您可以避開eval和使用間接擴展提取時給定密鑰的數組中的值。請注意,[key]後綴必須是擴展的一部分:

valref="queue${count}[$key]" 
echo ${!valref} 

爲了把這一背景下:

for count in {1..5} ; do 
    keyref="queue${count}[@]" 
    for key in $(eval echo '${!'$keyref'}'); do 
     valref="queue${count}[$key]" 
     echo "key = $key" 
     echo "value = ${!valref}" 
    done 
done 
+0

現貨! ++的信息性解釋。謝謝! – Indecided

1

我能夠使之與下面的腳本工作:如果任意鍵中包含空格,

for count in {1..5} ; do 
    for key in $(eval echo '${!q'$count'[@]}') ; do 
     eval echo '${q'$count"[$key]}" 
    done 
done 

注意它打破。如果您想處理複雜的數據結構,請使用更強大的Perl語言。

0

我想這可能工作(但未經檢驗)。關鍵是將索引 作爲變量的全名。 (即,該陣列queue5可以 視爲命名queue5[this]變量的序列,queue5[that]等)

for count in {1,2,3,4,5} do 
    assoc="queue$count[@]" 
    for key in "${!assoc}" do 
     echo "key : $key" 
     val="queue$count[$key]" 
     echo "value : ${!val}" 
    done 
done 
+0

這似乎遍歷數組中的值(而不是數組中的鍵)。我想你可以在某些工作中使用該值來挖掘關鍵字,但是非唯一值可能存在問題。 – doubleDown

+0

間接引用適用於訪問數組值,但不適用於鍵。詳情請參閱我的回答。 –