GNU/Linux >> Linux の 問題 >  >> Linux

配列のBash配列?

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

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

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

それでは、サブグループを繰り返します(将来的にはもっとバー sおよび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

私が書いたクローズコードはバーで失敗するようです およびfoo 配列と各セットの要素による拡張。

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

承認された回答:

これはbashでかなり一般的な問題です 、declare -nを使用して名前参照を作成する必要がある配列内の配列を参照します。 。 -nに続く名前 割り当てられた値へのnamerefとして機能します(=の後) )。ここで、この変数を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

bashに注意してください v4.3以降のnamerefのみをサポートします。古いバージョンおよびその他の回避策については、間接/参照変数の割り当て

を参照してください。 関連:デフォルトのシェルとしてbashを使用する方法は?
Linux
  1. 例を含む Bash 配列

  2. 5つの実用的な例で説明されたAWK配列

  3. Bash の配列が見つかりません

  1. bash `ls` 出力を json 配列に変換します

  2. bash のテキスト文字列を配列に変換する

  3. Bash でコマンドのグループをタイムアウトする方法

  1. Bashの文字列/配列から一意の要素の配列を作成するにはどうすればよいですか?

  2. Bash変数代入の単一括弧?

  3. bashで配列値をシフトする方法