![Linux shell 脚本中 if...elif 语句出错](https://linux22.com/image/119111/Linux%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%20if...elif%20%E8%AF%AD%E5%8F%A5%E5%87%BA%E9%94%99.png)
#!/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...
另请注意变量扩展的引用。稍后在代码中,您还需要引用 in ,*
以便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"