bash 配列配列

bash 配列配列

ネストされたループを作成しようとしていますが、それを書く方法がわかりません。私が間違った方向を見ているかもしれませんが、私が書きたいものは次のとおりです。

declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")

declare -a subgroups=("bar" "foo")

次に、サブグループを繰り返したいと思います(これについては後で詳しく説明します)。バー金持ちsが表示されます)要素の数が異なる可能性があるため、内部で繰り返します。

希望の出力は次のようになります。

group name: bar with group members: alpha bravo charlie
        working on alpha of the bar group
        working on bravo of the bar group
        working on charlie of the bar group
group name: foo with group members: delta echo foxtrot golf
        working on delta of the foo group
        working on echo of the foo group
        working on foxtrot of the foo group
        working on golf of the foo group

私が書いた終了コードが失敗したようです。バーそして金持ち各セットの要素を含む配列と拡張です。

for group in "${subgroups[@]}"; do
   lst=${!group}
   echo "group name: ${group} with group members: ${!lst[@]}"
   for element in "${!lst[@]}"; do
       echo -en "\tworking on $element of the $group group\n"
   done
done

出力は次のとおりです

group name: bar with group members: 0
        working on 0 of the bar group
group name: foo with group members: 0
        working on 0 of the foo group

ベストアンサー1

これは非常に一般的な問題ですbash。配列内で配列を参照するには、を使用して名前参照を作成する必要がありますdeclare -n。次の名前は、 -n割り当てられた値(後ろ)の名前参照として機能します=。次に、nameref プロパティを使用してこの変数を処理し、配列と同じように拡張し、以前と同様に完全に正しい参照配列拡張を実行します。

for group in "${subgroups[@]}"; do
    declare -n lst="$group"
    echo "group name: ${group} with group members: ${lst[@]}"
    for element in "${lst[@]}"; do
        echo -en "\tworking on $element of the $group group\n"
    done
done

namerefはbashv4.3からのみサポートされています。以前のバージョンやその他の回避策については、次を参照してください。間接/参照変数の割り当て

おすすめ記事