2012-11-09 17 views
6

私は反復してそのキーと値のペアを検索する連想配列の可変リストを持っています。Bashスクリプト - 連想配列のリストの変数 "変数"を反復する

私はすべてのキーを列挙して値を取得することで、単一の連想配列を反復処理します。

微妙な部分は、連想配列の名前が可変変数であるということです。与えられた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を回避し、抽出する際に、間接的拡張を使用することができますキーが与えられた配列からの値コンテキストでこれを置くため

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

Spot on! ++有益な説明のために。ありがとうございました! – 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

私はこれが動作(ただし、未テスト)かもしれないと思う[key]接尾辞は、拡張の一部でなければならないことに注意してください。キーは、変数のフルネームとしてインデックス番号 を扱うことです。 (すなわち、配列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

間接参照は配列値にアクセスするために機能しますが、キーには機能しません。詳細は私の答えを見てください。 –

関連する問題