6

キーと値のペアを繰り返して取得したい連想配列の変数リストがあります。

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

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

助けていただければ幸いです!

4

3 に答える 3

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
于 2012-11-09T10:59:03.547 に答える
1

次のスクリプトで動作させることができました。

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

キーにスペースが含まれていると壊れることに注意してください。複雑なデータ構造を処理する場合は、Perlなどのより強力な言語を使用してください。

于 2012-11-09T10:10:57.673 に答える
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
于 2012-11-09T14:42:20.327 に答える