私はシェルプログラミングの基礎を学んでいて、次のような簡単なものを作成しました。
#!/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
実際に(または以前の)組み込み関数を使用して、変数にいくつかのプロパティを設定できますtypeset
。declare -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