我可以使用以下命令读取数字并进行以下操作:

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op


,但随后所有加法的尝试均失败:

case "$op" in
  "+")
    echo num1+num2;;
  "-")
    echo `num1-num2`;;
esac


运行:

First number please
1
Second mumber please
2
Operation?
+


输出:

num1+num2


...或...

echo $num1+$num2;;

# results in: 1+2    


...或...

echo `$num1`+`$num2`;;

# results in: ...line 9: 1: command not found


当我尝试添加添加(“ 2 + 2”而不是“ 4”)时。

评论

我编辑了您的标题,因为这是一个很好的一般性问题,如果缩小上下文范围,您会意识到这与大小写或其他任何内容都没有关系,只不过一行:echo $ num + $ num,因为这样可以准确地重现问题。此处解释了在编程问题中最小化上下文的想法:sscce.org

+1嗨,金发姑娘,后来我对我很清楚,但是是的,我完全同意你的推理方法,是的,问题越具体,越“单一”就越好。我欢迎您的编辑:)谢谢:)

#1 楼

POSIX shell中的算术运算是用$和双括号(( ))完成的:

echo "$(($num1+$num2))"


您可以从中分配(无echo):

num1="$(($num1+$num2))"


还有expr

expr $num1 + $num2


在脚本编写中,$(())是可取的,因为它避免了对expr命令执行fork / execute。

评论


甚至直接回显$((($ num1 $ op $ num2)))而不涉及大小写。

–manatwork
2013年9月30日在16:44

这里没有任何案件。

–金锁
2013年9月30日16:49

否,但是您使用了文字+,因此将需要外面的大小写分别处理减法。

–manatwork
2013年9月30日16:51

@manatwork:您的意思是通过回显$(($ num1 $ op $ num2))从OP的代码中消除这种情况-可以,但是使用这种情况更为可靠,因为您可以使用默认*处理错误。

–金锁
2013年9月30日17:04



+1。我使用的是案例(可能一开始可能没有显示出来),但是你们俩都意识到问题与案例无关。

–迈克尔·杜兰特(Michael Durrant)
2013年9月30日17:05



#2 楼

现有的答案是纯bash,因此它将比此速度更快,但只能处理整数。如果需要处理浮点数,则必须使用外部程序bc

$ echo 'scale=4;3.1415+9.99' | bc
13.1315


scale=4告诉bc使用四位小数。有关更多信息,请参见man bc

评论


请注意,尽管bash不支持使用$((...))进行浮点运算,但许多shell(至少是ksh93,zsh,yash)支持。 bc的优点是它支持任意精度,而shell算术仅限于处理器的double类型。请注意,您无需在此处设置比例。对于添加,不使用scale参数。 3.1415 + 9.99的小数位数将从操作数的小数位数(此处为4)得出。

–StéphaneChazelas
16 Dec 20'在12:06



如果一个值是450,另一个是十进制值,该数学值如何存储在变量$ mynumber中?例如,450- $ mynumber。

–西格
17年3月17日在22:34

@sigur echo“ 450- $ mynumber” |公元前应该这样做。如果要扩展变量,则必须使用双引号而不是单引号。

– evilsoup
17年3月17日在23:22

@evilsoup,现在它就像一种魅力。谢谢。

–西格
17 Mar 17 '17在23:30

computeval = $(echo'scale = 10; var1-var2'| bc)不起作用,computeval = $(echo'scale = 10; $ var1- $ var2'| bc)也不起作用

–StatsSorceress
19年5月3日,1:50

#3 楼

您也可以使用$[ ... ]结构。在这种情况下,我们在Bash中使用内置的机械化机制,该机制更快且使用起来更方便。由于我们知道$ [和]之间的所有内容都被视为表达式,因此我们不需要在变量前加$。同样,我们不需要保护*像对待样式一样。

num1=2
num2=3
echo $[num1 + num2]
5


#4 楼

echo `expr $a + $b`   
echo `expr $a - $b`   
echo `expr $a \* $b`   
echo `expr $a / $b`   


注意\前面的*(用于乘法),
整个表达式必须在反引号`。
之内。

评论


expr是没有必要的,也不必捕获命令的标准输出而只是将其写回到标准输出。

–chepner
15年11月1日在18:07

#5 楼

极简主义者

total=0
((total+=qty))


#6 楼

根据用户要求的输入顺序,似乎您正在使用反向抛光符号。


echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op



您可能会做得更好只是直接使用dc(台式计算器),因为这就是它的用途。

DESCRIPTION
       Dc is a reverse-polish desk calculator which supports unlimited pre-
       cision arithmetic.


使用dc的示例会话:

$ dc
1 2 + p    # This part is typed; the result comes next.
3
q  # This is also typed.
$


或者非交互地:

$ dc -e '1 2 + p'
3
$