
ループの配列名などの配列値を使用して二重ループを実行しようとしています。
array1="name1 name2"
name1="one two"
name2="red blue"
for name in $array1
do
for value in $name
do
echo "$name - $value"
done
done
2番目のループでは、「$ name」に「name」を使用する必要がありますが、これは機能しません。
配列名のように、2番目のループでarray1値をどのように使用できますか?
答え1
これはあなたがいる場所ではありませんbash
。
a="foo bar"
文字列/スカラー変数を定義します。分割+グローブ演算子を実行するために(引用符なしで)使用されます。これは$a
、ファイルパターンの区切りリストを表す文字列にのみ意味があります。$IFS
のbash
配列は次のように定義されます。
a=(foo bar)
ここで欲しいものは次のとおりです。
array1=(name1 name2)
name1=(one two)
name2=(red blue)
for name in "${array1[@]}"
do
typeset -n nameref="$name"
for value in "${nameref[@]}"
do
printf '%s\n' "$name - $value"
done
done
typeset -n
比較的新しい追加bash
であり、ステータス名前参照は他の変数の名前を含む変数で、拡張すると実際には指定された変数を指す。
答え2
for value in $name
からに簡単に変更すると、for value in ${!name}
スクリプトが正しく機能します。
array1="name1 name2"; name1="one two"; name2="red blue"
for name in $array1 ; do
for value in ${!name} ; do
printf '%s - %s\n' "$name" "$value"
done
done
しかし、呼び出される変数はarray1
配列ではなく文字列であり、まったくないことを指摘することが重要です。
配列を使用するには:
#!/bin/bash
array1=(name1 name2)
name1=(one two)
name2=(red blue)
for name in "${array1[@]}" ; do
ref="${name}[@]"
for value in "${!ref}" ; do
printf '%s - %s\n' "$name" "$value"
done
done
bash 2.0(1997)以降で間接的に動作します。最近4.3にnamerefが追加されました。
答え3
Stéphane Chazelasが指摘したように、単語リストは配列と同じではありません。ただし、次のように間接拡張を使用できます。
array1="name1 name2"
name1="one two"
name2="red blue"
for name in ${array1}
do
for value in ${!name}
do
echo "$name - $value"
done
done
この場合、${!name}
間接レベルが導入される。