Linuxシェルスクリプトのif ... elifステートメントにエラーがあります。

Linuxシェルスクリプトのif ... elifステートメントにエラーがあります。
#!/bin/bash
echo "enter your choice :"
echo "1 Addition"
echo "2 subtract"
echo "3 Multiplication"
read er
echo "enter the first number : "
read a
echo "enter the second number : "
read b
if [ $er="1" ]
then
sum=`expr $a + $b`
echo "sum of two numbers is $sum"
elif [ $er="2" ]
then
sub=`expr $a - $b`
echo "the diff of two numbers is $sub"
exit 0
elif [ $er="3" ]
then
mult=`expr $a * $b`
echo "the div of two numbers is $mult"
exit 0
else
echo "invalid choice"
fi

これは単純な電卓スクリプトです。しかし、最初の加算if文までのみ実行され、その後は乗算、減算条件が真であってもelif文は実行されません。

答え1

=テストでは、周囲にスペースが必要です。$er=1そうでなければ(例えば)比較として正しく解釈されない。

if [ "$er" = "1" ]           # or:  if [ "$er" -eq 1 ]
then
sum=`expr "$a" + "$b"`       # or:  sum=$( expr "$a" + "$b" )  or: sum=$(( a + b ))
echo "sum of two numbers is $sum"
elif [ etc...

また、変数の拡張に関する参照も参照してください。コードの後半では、ファイル名のグロービングパターンとして解釈されないように*引用符を付ける必要があります。mult=`expr $a * $b`

exprそれぞれを等しいものに置き換えることができます$(( ... ))(算術拡張)。過去数十年間、それはexpr廃止されました。

コマンドを置き換えるためにバックティックを使用することもお勧めできません。構文は$( ... )多くの点で優れています。たとえば、入れ子にする方が良いです。

result=$( echo $( echo a ) $( echo b ) )  # pretty much impossible with backticks

...そして引用符もうまくいきます。これは、内部引用文と外部引用文が$( ... )互いに干渉しないためです。

また見なさい:


case ... esacこのコードを使用すると利点が得られます。

case "$er" in
    1) result=$(( a + b )); op='sum'        ;;
    2) result=$(( a - b )); op='difference' ;;
    3) result=$(( a * b )); op='product'    ;;
    *) printf 'Invalid choice: "%s"?\n' "$er" >&2
       exit 1
esac

printf 'The %s of %s and %s is %s\n' "$op" "$a" "$b" "$result"

関連情報