
私は2つの整数を要求してからa / s / m / dを選択して、加算、減算、乗算、または除算を要求するクラス用のスクリプトを作成しています。また、整数と有効なオプションを入力したことを確認しますが、これについては後で説明します。今これが私が持っているものです:
#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func
if [ "$func" -eq "a" ]; then
echo $((num1 + num2))
fi
if [ "$func" -eq "s" ]; then
echo $((num1 - num2))
fi
if [ "$func" -eq "m" ]; then
echo $((num1 * num2))
fi
if [ "$func" -eq "d" ]; then
echo $((num1 / num2))
fi
else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
実行すると、コンテンツを正しく要求しても理解できないエラーが発生します。
./MathTest.sh: line 9: [: a: integer expression expected
./MathTest.sh: line 13: [: a: integer expression expected
./MathTest.sh: line 17: [: a: integer expression expected
./MathTest.sh: line 21: [: a: integer expression expected
./MathTest.sh: line 25: syntax error near unexpected token `else'
./MathTest.sh: line 25: `else'
誰でもこの問題を解決するのに役立ちますか?
答え1
=
整数比較()の代わりに文字列比較()を使用する必要がありますeq
。スクリプトに対応
else
するステートメントがありませんif
。一連の if/then/else if/then/.../else ステートメントを実行するには、if ... elif ... elif .... else ... fi
代わりに ... を使用する必要があります。if ... fi; if ... fi; if ... fi; else
または氏名を使用してくださいcase
。明確でなければ
elif
という意味ですelse if
。たとえば、
#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func
case "$func" in
a) echo $((num1 + num2)) ;;
s) echo $((num1 - num2)) ;;
m) echo $((num1 * num2)) ;;
d) echo $((num1 / num2)) ;;
*) echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide" ;;
esac
各ケースのコードは2つのセミコロンで終わる必要があることに注意してください;;
。これは、各ケースに複数のコードステートメントがある可能性があるためです(改行または単一のセミコロンで区切られています)。したがって、シェルインタプリタは他の状況を区別する方法が必要です。事件と事件の終わり、そして;;
それが何をするために使用されるか。
ケースごとに2つのドアを示す簡単な例:
case "$func" in
a) echo "addition:" ; echo $((num1 + num2)) ;;
s) echo "subtraction:" ; echo $((num1 - num2)) ;;
...
esac
case
ステートメント(私の意見では、コードを読みやすくし、確かに短くて少なく繰り返します)ではなく、次のようにif / elif / else / fiを使用できます。
if [ "$func" = "a" ]; then
echo $((num1 + num2))
elif [ "$func" = "s" ]; then
echo $((num1 - num2))
elif [ "$func" = "m" ]; then
echo $((num1 * num2))
elif [ "$func" = "d" ]; then
echo $((num1 / num2))
else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
fi
これは比較=
ではなく使用-eq
を意味します(数字以外の文字列を比較するためです)、単一のif ... fiステートメントではなく、if、elif、elif、elif、else、fiステートメントの長いリストです。
ちなみに、if / elif / fiチェーンといくつかのif ... fiステートメントの間には非常に重要な違いがあります。 if/elif/elif/elif/.../else/fiの場合のみ最初真の結果は永久に実行され(そのどれも真でなければelseコードが実行されます)、ステートメントの動作case ... esac
方法と同様に、シェルはチェーン全体の終わりにジャンプします。
複数のif ... fi
ステートメントの場合、各ステートメントは順番に評価され、true と評価される各ステートメントは、他のすべてのテストとは独立して実行されます。