Bash: 整数式が必要です。読み取り/テストを使用します

Bash: 整数式が必要です。読み取り/テストを使用します

私はシェルプログラミングの基礎を学んでいるので、次のような簡単なものを書きました。

#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
    echo "var1 is lt var2"
else
    echo "var2 is lt var1"
fi

私の理解では、Bash では変数は型指定されておらず、数字のみを含む変数は整数として使用できます。しかし、これを実行すると「整数式が必要です」というエラーが表示されます... なぜでしょうか?

答え1

declare実際には、 (または古い) 組み込み関数を使用して変数にいくつかの属性を設定できますtypesetdeclare -i var1 var2は、それらの変数に整数属性を設定します。 その後、それらの変数に整数以外の値を設定する割り当てを行うと、エラーが発生します。

しかし、問題は構文にあります。変数の値を使用する場合は、その名前の前に次の接頭辞を付ける必要があります$

if [ "$var1" -lt "$var2" ]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

例外は算術評価で、 は必要ありません$

if ((var1<var2)); then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

警告として、[..内では]、単語の拡張によって式の構文がおかしくなるのを避けるために、常に変数を二重引用符で囲んでください。(つまり、未設定の変数、空の文字列を含む変数、文字を含む変数で問題が発生します。) または、代わりに、このようなケースを正しく処理する、IFSより新しくて優れた[[..を使用することもできます。]]

if [[ $var1 -lt $var2 ]]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

答え2

変数を参照する場合は、名前の前に$

if [ $var1 -lt $var2 ] ; then...

関連情報