#!/bin/bash
sum=0
i="y"
echo "Enter the first value"
read a
echo "Enter the second value"
read b
while [$i="y"]
do
echo "1.Addition"
echo "2.Subtraction"
echo "3.Multiplication"
echo "4.Division"
echo "Enter your choice:"
read ch
case $ch in
sum=expr $a+$b | bc
echo "Summation:" $sum;;
sub=expr $a-$b | bc
echo "Subtraction:" $sub;;
mul=expr $a*$b | bc
echo "Multiplication:" $mul;;
div=expr $a/$b | bc -l
echo "Division:" $div;;
*)echo "Invalid Choice"
esac
echo "Do You Want To Continue?"
read i
if(($i!="y")) ; then
echo "Bye"
exit0
fi
done
我在第17行得到错误为什么?
有没有错误?
请帮帮我
ERRORS
line 24: syntax error near unexpected token $a+$b'
line 24: sum=expr $a+$b | bc'
案例陈述也存在问题
答案 0 :(得分:2)
通常,在http://shellcheck.net检查损坏的shell代码就足以诊断问题了。
注意:有些问题会阻碍前面的全面分析。您可能必须修复初始问题以揭示其他问题。
请注意,代码中的许多问题源于不使用必需的空格来满足语法要求 - 空间在bash
编程中很重要(一般是shell编程)。
while [$i="y"]
缺少空格
最终应该是while [[ $i == "y" ]]
。
[
或[[
必须后跟空格,]
或]]
前面必须有 - 使用{{1在} [[ ... ]]
中优先于[ ... ]
,因为它更强大且功能更多。
bash
和[ ... ]
条件中的运算符也需要它们周围的空格
,因为[[ ... ]]
将执行字符串连接:bash
被解释为单个字符串,并且(在第一次迭代中)将产生字符串 literal $i="y"
。< / p>
您的 y=y
语句缺少分支模式来描述每个分支应该执行的时间,正如@Jidder在评论中指出的那样(我们会查看内部损坏的代码)稍后引用的分支)(奇怪的是,你确实有一个模式,即 else 分支的模式,case
):
*)
缺少命令替换(case $ch in
1) # pattern followed by `)`describing when the branch should be executed
sum=expr $a+$b | bc
echo "Summation:" $sum;;
2)
# ...
)以捕获命令输出:
$(...)
不会在变量sum=expr $a+$b | bc
中捕获管道的结果,因为您需要command substitution来捕获命令的输出(我们将查看如何稍后要删除要捕获的特定命令:
$sum
sum=$(expr $a+$b | bc)
期望计算的元素为单独的参数,因此它应该是expr
(注意空格)。
更重要的是,但是:你还将结果导管到expr "$a" + "$b"
,这是毫无意义的,因为bc
已经执行了计算。
您有两个选择:
如果整数计算已足够,则只使用expr
。最好使用bash的内置arithmetic expansion:expr
(请注意sum=$(( a + b ))
变量名前缀在那里是可选的,甚至是空格是可选的,与$
)不同。
仅使用[[ ... ]]
也支持带小数部分的计算:bc
- 至少在除法的情况下,sum=$(echo "$a + $b" | bc)
是必需的。
bc
通常更强大地编写为echo "Summation:" $sum
,因为未加引号的变量引用受各种shell expansions的约束,这可能会产生意外的一面 - 的效果。
根据经验,双引号变量引用(自身或作为较大字符串的一部分)。
echo "Summation: $sum"
无法按预期工作,因为 (($i!="y"))
仅用于算术评估,而非用于字符串比较;您正在寻找的是((...))
(再次注意空格)。
但是,由于您的[[ $i != "y" ]]
循环条件会对此进行测试,因此您只需将while
和echo "Bye"
命令移到循环之外即可。 (请注意,您错过了exit 0
和exit
之间的空格。
如果我们把它们放在一起(但请注意,仍有改进的余地):
0