次のループで異なる名前のファイルセットを処理するために、シェルスクリプトで動的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