![Bash: 整数式が必要です。読み取り/テストを使用します](https://rvso.com/image/23940/Bash%3A%20%E6%95%B4%E6%95%B0%E5%BC%8F%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%2F%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99.png)
私はシェルプログラミングの基礎を学んでいるので、次のような簡単なものを書きました。
#!/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
答え2
変数を参照する場合は、名前の前に$
if [ $var1 -lt $var2 ] ; then...