在bash中使用case和while循环进行算术运算

时间:2014-06-09 13:43:35

标签: bash

#!/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'

案例陈述也存在问题

1 个答案:

答案 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 expansionexpr (请注意sum=$(( a + b ))变量名前缀在那里是可选的,甚至是空格是可选的,与$)不同。

  • 仅使用[[ ... ]]也支持带小数部分的计算:bc - 至少在除法的情况下,sum=$(echo "$a + $b" | bc)是必需的。


bc通常更强大地编写为echo "Summation:" $sum,因为未加引号的变量引用受各种shell expansions的约束,这可能会产生意外的一面 - 的效果。

根据经验,双引号变量引用(自身或作为较大字符串的一部分)。


echo "Summation: $sum"无法按预期工作,因为 (($i!="y"))仅用于算术评估,而非用于字符串比较;您正在寻找的是((...))(再次注意空格)。

但是,由于您的[[ $i != "y" ]]循环条件会对此进行测试,因此您只需将whileecho "Bye"命令移到循环之外即可。 (请注意,您错过了exit 0exit之间的空格。


如果我们把它们放在一起(但请注意,仍有改进的余地):

0