forループのエコー変数名

forループのエコー変数名

私はこれを持っています:

test1="1"
test2="2"
test3="3"

for i in "$test1" "$test2" "$test3"; do
        echo "$i"
done ;

$i内容ではなく変数名をエコーし​​たいです。

エコー出力は「test1」、「test2」、または「test3」でなければなりません。

どうすればいいですか?

答え1

本当にしたい場合は、次のようにします。

#!/bin/bash
test1='1'
test2='2'
test3='3'
for v in "test1" "test2" "test3"; do
        echo "The variable's name is $v"
        echo "The variable's content is ${!v}"
done 

しかし、あなたはおそらく配列の使用を好む動的変数名の代わりに使用することは悪い習慣と見なされ、コードを理解するのが難しくなります。したがって、次のようなより良い形式を考えてみましょう。

#!/bin/bash
test[0]='1'
test[1]='2'
test[2]='3'
for ((i=0;i<=2;i++)); do
        echo "The variable's name is \$test[$i]"
        echo "The variable's content is ${test[$i]}"

done 

答え2

一重引用符を使用してください。

for i in '$test1' '$test2' '$test3'; do
    echo "$i"
done

それ以外の場合は、バックスラッシュを使用してドル記号をエスケープします。

for i in \$test1 \$test2 \$test3; do
    echo "$i"
done

答え3

意味for i in "$test1" "$test2" "$test3":$i維持されますコンテンツ3つの変数test1、test2、test3 - 実際には1、2、3を含みます。

印刷したい場合テスト1テスト2そしてテスト3記号なしで呼び出す必要があります$。つまり、値ではなく実際の名前を使用する必要があります。

次のコード(変数の前の前の$コードなし)test1/2/3は、必要なものを印刷します。

test1="1"
test2="2"
test3="3"

for i in "test1" "test2" "test3"; do
        echo "$i"
done ;

結果:

test1
test2
test3

答え4

ksh93またはバッシュ:

$ test1=aa; test2=bb; test3=cc
$ for x in "${!test@}" ; do echo "$x" ; done 
test1
test2
test3

(変数は語彙的に拡張されるため、test10前に表示されますtest2。)

関連情報