【问题标题】:How can I do basic maths in bash?如何在 bash 中做基础数学?
【发布时间】:2014-11-23 02:36:21
【问题描述】:

我做了一些我认为应该是一个名为 bashispainful.sh 的 shell 脚本:

代码:

#!/bin/bash
Var1= $((10*5))
Var2= $((10/5))
Var3= $((10-5))
Var4= $((10+5))
Var5= ($(Var4)*$(Var3))
echo $Var1
echo $Var2
echo $Var3
echo $Var4
echo $Var5

我想收到输出:

50
2
5
15
75

我目前的输出:

./Bashispainful.sh: line 2: 50: command not found
./Bashispainful.sh: line 3: 2: command not found
./Bashispainful.sh: line 4: 5: command not found
./Bashispainful.sh: line 5: 15: command not found
./Bashispainful.sh: line 6: syntax error near unexpected token `('
./Bashispainful.sh: line 6: `Var5= ($(Var4)*$(Var3))'

我的目标是掌握在 bash 中进行基本数学运算的能力。我已经尝试了每个网站以及括号、美元符号以及我能想到的各种组合,坦率地说,我感到困惑和绝望。如何在 bash 中执行简单的数学运算?

(请让这个容易理解 - 请假设我是一个非程序员和愚蠢的人)

【问题讨论】:

  • 顺便说一下,如果你在做算术,你可以使用((...))算术形式,其中变量不需要以$为前缀(除非它们是位置参数,如$3) 和空格无关紧要。例如:(( a = 42 , b = a - 27))

标签: linux bash shell


【解决方案1】:

Bash 并不痛苦:

#!/bin/bash
Var1=$((10*5))
Var2=$((10/5))
Var3=$((10-5))
Var4=$((10+5))
Var5=$((Var4*Var3))
echo $Var1
echo $Var2
echo $Var3
echo $Var4
echo $Var5

输出是:

50
2
5
15
75

注意事项

考虑:

Var1= $((10*5))

在 bash 进行算术替换后,该命令如下所示:

Var1= 50

该命令说 (a) 临时将 Var1 设置为空,并且 (b) 运行名为 50 的命令。由于没有名为50 的命令,您会收到错误:

Bashispainful.sh: line 2: 50: command not found

解决方案是删除空格,以便将Var1 分配给非空值:

Var1=$((10*5))

考虑:

Var5= ($(Var4)*$(Var3))

对于名称以( 开头的命令,这会将Var5 临时设置为空。那是无效的。因此错误:

./Bashispainful.sh: line 6: syntax error near unexpected 

算术的正确 bash 语法是 $((...))。因此,该行可以写成:

Var5=$(($Var4*$Var3))

但是,由于 bash 并不痛苦,它理解算术表达式中的字符串是 shell 变量。因此,美元符号是不必要的,上面可以简化为:

Var5=$((Var4*Var3))

另外,由于上面只是对变量进行赋值,因此可以进一步简化为:

((Var5=Var4*Var3))

请注意,$((...)) 返回算术计算的值,但((...)) 不返回任何值。它确实设置了一个退出代码,这使它对 if 语句中使用的测试很有用。

【讨论】:

  • 那么您的意思是空格在 bash 中很重要吗? (从来没有使用过他们以前甚至有点重要的语言)Bash 会很痛苦。还是谢谢你。绝对是赞成票!
  • 是的,空格在 bash 中很重要,就像在任何其他 shell 中一样。如果您认为这很痛苦,请将空格视为与其他字符一样的字符:为什么 x 或引号很重要,而不是空格字符?
  • 我明白了——我真的很难接受这个。
  • @Reluctant_Linux_User 每种计算机语言都是为不同的目的而设计的。接受它的本质,bash 非常强大:Var= command 执行一个命令,其中Var 设置为空,而Var=command 将变量设置为具有值command
  • @Reluctant_Linux_User 不是我知道的,当然也不是符合 POSIX 标准的。
【解决方案2】:

删除 $ 之前的空格并将括号从 Var5 声明中的行移开。

#!/bin/bash
Var1=$((10*5))
Var2=$((10/5))
Var3=$((10-5))
Var4=$((10+5))
Var5=$((Var4*Var3))
echo $Var1
echo $Var2
echo $Var3
echo $Var4
echo $Var5

声明的空格螺丝,你想从Var4和Var3读取值,所以你需要两个括号。

【讨论】:

    【解决方案3】:

    您不能在 = 之前或之后放置空格,或者 bash 在本地环境中将 Var1 设置为空字符串时尝试执行命令 $((10*5))(即 50)。此外,使用不带美元符号的单括号(…) 调用子shell,使用美元符号$(…) 调用子shell 并替换为命令的输出,并且美元符号在算术表达式中是可选的。

    所以你想做的是:

    #!/bin/bash
    Var1=$((10*5))
    Var2=$((10/5))
    Var3=$((10-5))
    Var4=$((10+5))
    Var5=$((Var4*Var3))
    echo $Var1
    echo $Var2
    echo $Var3
    echo $Var4
    echo $Var5
    

    【讨论】:

    • 您可以从$((...)) 中的变量中省略前面的$。好的,你在编辑中做了..
    • 看到,好消息是它们对于常规变量本质上是可选的。无论哪种方式,它都会起作用。仅当包含 brace protected 变量(例如 ${var:(-3):2})时才需要它们。
    【解决方案4】:

    检查 bash 命令“expr”

    例如,如果您想添加两个数字: var=expr 2 + 6

    更多表达式请参考手册页。

    【讨论】:

    • 什么是“手册页”?我是个认真的菜鸟。
    • 你可以在 bash 中输入“man expr”。或者这里是 expr 的网页”ss64.com/bash/expr.html
    • expr 是不必要的冗长。为什么不使用$(())
    • 您好,欢迎来到 StackOverflow。能否请您格式化这个问题,使其更清晰,更清楚地表达您的意图,以及对正在发生的事情的有用解释?
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2012-07-06
    相关资源
    最近更新 更多