![名前の代わりにインデックス変数の数値を返します。 [重複]](https://linux33.com/image/3350/%E5%90%8D%E5%89%8D%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E5%A4%89%E6%95%B0%E3%81%AE%E6%95%B0%E5%80%A4%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%5B%E9%87%8D%E8%A4%87%5D.png)
以下のコードは私の問題を示しています。最初は過度に単純化したようです。
#!/bin/bash
dogLover=1
catLover=2
for ii in dog cat
do
petLover=${ii}Lover
echo (evaluate $petLover)
done
犬や猫ではなく、1と2の値を返すコードが欲しいです。おそらくこれは簡単ですが、オンラインで行う方法がわからないようです。
私にとって本当に必要なのは、matlabの「eval」コマンドに対応するbashです。
答え1
Bourne または POSIX シェルで逆参照するには、次のようにします。
dogLover=1
ii=dog
eval "petLover=\${${ii}Lover}"
echo "$petLover"
答え2
StephaneChazelasが言ったことは正確で、evalを使うことができますが、eval
一般的に多くの人はevalを遠ざけようとしています。
これには「間接拡張」を使用できます。他の変数の名前を含む変数があるときに使用されます。これを使用するには、変数の前に中!
かっこを付けます。
たとえば、
# var=foobar
# varname=var
# echo "${!varname}"
foobar
これの欠点は、POSIXではないことです。これは、すべてのシェルで利用できるという保証がないことを意味します。ただし、お客様の質問にタグが含まれているため、bash
これは許可される場合があります。
答え3
forループでは、変数の代わりに「dog」テキストと「cat」テキストを使用します。
使用
for ii in $dog $cat ; do
これは次のように拡張されます。
for ii in 1 2 ; do