Bash - 配列ループを使用してネストされたforループ

Bash - 配列ループを使用してネストされたforループ

1つの配列と2つの連想配列があります。コードを維持できるようにしたいので、デフォルトの配列リストを使用して2つの連想配列を繰り返したいと思います。しかし、正しく理解できないようです。

連想配列のキー値を印刷しようとすると、結果は常にゼロです。

以下は私のサンプルコードです。

declare -A list_a list_b
list_a=( [a]=1 [b]=2)
list_b=( [c]=3 [d]=4)
master_list=(list_a list_b)

for thelist in "${master_list[@]}"
do
   for key in "${!thelist[@]}"
   do
     #it show be printing out the keys of the associative array
     echo "the key is: $key"
   done
done

Output:
the key is: 0
the key is: 0

何が問題なのか知っていますか?

答え1

配列間接参照を拡張するには、文字列が変数の[@]一部である必要があります。次の値で動作します。

for thelist in "${master_list[@]}" ; do
    reallist=$thelist[@]
    for key in "${!reallist}" ; do
        echo "the key is: $key"
    done
done

鍵の場合eval

for thelist in "${master_list[@]}" ; do
    eval keys=('"${!'$thelist'[@]}"')
    for key in "${keys[@]}" ; do
        echo "the key is: $key"
    done
done

master_listに変数名のみが含まれていることを確認する限り、安全でなければなりません。

答え2

遊ぶのが楽しいしかし、bashにはあなたの想像力を満たすことができないいくつかの問題があるようです;)

list_a=( 1 2 )
list_b=( 3 4 )

for key in "${list_a[@]}" "${list_b[@]}"; do
  echo "the key is: $key"
done

出力:

the key is: 1
the key is: 2
the key is: 3
the key is: 4

関連情報