シェルスクリプトで値の代わりに変数名を印刷するには?

シェルスクリプトで値の代わりに変数名を印刷するには?

以下は私のプログラムですa.sh

A=10 B=20 C=0 D=1

for var in {A,B,C,D}
do
    if [ $var = 0 ]
    then
        echo "$var value is 0"
    else
        echo "Ok" 
    fi
done

結果:

# sh a.sh

Ok
Ok
0 value is 0   <==== Instead of this I want  "C value is 0"
Ok

私たちは何をすべきですか?

答え1

そしてbash

A=10
B=20
C=0
D=1

for var in A B C D; do
    if [ ${!var} -eq 0 ]; then
        echo "$var value is 0"
    else
        echo "Ok"
    fi
done

-eq整数値を比較し(または同じものを使用して)、(( ${!var} == 0 ))変数に名前が格納されている変数の値を取得するために使用します。(( !${!var} ))${!var}var

またはより簡潔ですが、本質的に同じです(まだbash)。

for var in A B C D E; do
    case ${!var} in
        0) printf '%s value is 0\n' "$var" ;;
        *) echo 'Ok' ;;
    esac
done

これは値を整数ではなく文字列として扱います。

関連情報