名前の代わりにインデックス変数の数値を返します。 [重複]

名前の代わりにインデックス変数の数値を返します。 [重複]

以下のコードは私の問題を示しています。最初は過度に単純化したようです。

#!/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

関連情報