Bash配列の値は、ループ内の変数のように動作します。

Bash配列の値は、ループ内の変数のように動作します。

ループの配列名などの配列値を使用して二重ループを実行しようとしています。

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}間接レベルが導入される。

関連情報