如何用bash加(减等)两个数字?


90

我可以阅读其中的数字和操作:

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”)时,我仍然在获取字符串。


5
我编辑了您的标题,因为这是一个很好的通用问题,如果缩小上下文范围,您将意识到这与case任何内容都无关,除了一行:echo $num+$num,因为这样可以准确地再现问题。这里解释了在编程问题中最小化上下文的想法:sscce.org
goldilocks 2013年

2
+1嗨,金发姑娘,是的,事后我就明白了,但是是的,我完全同意你的推理,是的,问题越具体,越“单一”就越好。我欢迎您的编辑:)谢谢:)
Michael Durrant

Answers:


116

POSIX shell中的算术$和双括号完成(( ))

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

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

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

还有expr

expr $num1 + $num2

在脚本中$(())是可取的,因为它避免了expr命令的派生/执行。


甚至直接echo $(($num1$op$num2))不涉及case
manatwork 2013年

这里没有case参与。
goldilocks 2013年

1
不,但是您使用了literal +,因此需要case外部分别处理减法。
manatwork 2013年

1
@manatwork:您的意思是case使用echo $(($num1$op$num2))-可以消除OP代码中的,但可以使用,但使用case鲁棒性更高,因为您可以使用default处理错误*
goldilocks

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

13

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

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

scale=4通知bc用四位小数。请参阅man bc以获取更多信息。


请注意,虽然bash不支持浮点算术用$((...)),许多炮弹(ksh93zshyash至少)做的。这样做的好处bc是它支持任意精度,而Shell算术仅限于处理器double类型。请注意,您无需在scale此处进行设置。对于添加,scale不使用该参数。的小数位数3.1415+9.99将取自操作数的小数位数(此处为4)。
斯特凡Chazelas

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

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

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

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

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

注意\*(乘法),整个表达式必须是反引号`内。


1
expr不必要,也不必捕获命令的标准输出,而只需将其写回到标准输出即可。
chepner


1

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

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

0

根据您向用户请求的输入顺序,似乎您正在使用反向抛光表示法。

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
$
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.