ネストされたループを作成しようとしていますが、それを書く方法がわかりません。私が間違った方向を見ているかもしれませんが、私が書きたいものは次のとおりです。
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はbash
v4.3からのみサポートされています。以前のバージョンやその他の回避策については、次を参照してください。間接/参照変数の割り当て
答え2
スクリプトを操作するための最小限の変更は次のとおりです。
#!/bin/bash
declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")
declare -a groups=("bar" "foo")
for group in "${groups[@]}"; 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
2つの主な変更点は次のとおりです。
アレイを使用
"${!lst[@]}"
またはアクセスしないでください。"${!group[@]}"
要素。この構文はただアクセスアレイ索引。使用してください
${!lst}"
。変数lstは、以下を含むように設定する必要があります。ひも一般項目の中に作成する必要があります
${ }
。つまり、lst=foo[@]
最初のレベルでlst="$group[@]"
必要に応じて、配列名も変数値を介して間接的ですgroup
。lst="$group[@]"
と同等の構文には拡張値はnamerefs
ありません!
(必要ありません)。
したがって[@]
、削除する必要があります。
echo "using namerefs"
for group in "${groups[@]}"; 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