私はこれを持っています:
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
。)