新しい変数名を動的に生成する方法

新しい変数名を動的に生成する方法

次のループで異なる名前のファイルセットを処理するために、シェルスクリプトで動的var名を生成しようとしています。

SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo SAMPLE{$i}
done

私は出力を期待しています:

1-first.with.custom.name
2-second.with.custom.name

しかし、私は次のようになります。

SAMPLE{1}
SAMPLE{2}

var名を動的に生成できますか?

答え1

配列を使用しない理由は、同様の操作を実行するために使用されます。

sample[1]='1-first.with.custom.name'
sample[2]='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo ${sample[$i]}
done

また、予約された変数名が誤って使用されないようにするには、スクリプト内の変数名をすべて大文字にしないでください。

答え2

次のように予想される結果が得られることがわかりました。

for (( i = 1; i <= 2; i++ ))
do
  NEW_NAME=SAMPLE$i
  echo ${!NEW_NAME}
done

答え3

これを行うには、移植可能なPOSIX標準シェルを使用し、配列などのbash拡張を使用しないようにするには、evalを使用する必要があります。

$ foo1='a b c'
$ foo2='d e f'
$ a=1; eval echo \$foo$a
a b c
$ a=2; eval echo \$foo$a
d e f

関連情報