BASH算术表达式

Ark*_*rko 19 math floating-point bash expression

我在BASH(3.2)中使用了几种方法来做一些简单的整数运算.但我无法找出最佳(首选)方式.

result=`expr 1 + 2`
result=$(( 1 + 2 ))
let "result = 1 + 2"
Run Code Online (Sandbox Code Playgroud)

这些表达之间的根本区别是什么?
还有其他方法可以做同样的事吗?

bc浮点运算是否使用强制工具?

result=`echo "7/354" | bc`
Run Code Online (Sandbox Code Playgroud)

Pau*_*ce. 18

在Bash中,let允许在一行上进行多项任务:

let a=3 b=4 c=5
Run Code Online (Sandbox Code Playgroud)

正如您在问题中所示,引用参数可以let让您在运算符周围放置空格.但是,如果避免使用空格,则可以省略引号.

在语句开头使用双括号(而不是i=$((j + 1))表单)的另一种形式允许您在等号周围包含空格,或者执行后或增加或减少以及其他赋值操作:

(( a = ( b + c ) * 4 ))
(( count++ ))
(( d = --c**2 ))
(( e *= 2 ))
(( f = 3, g = 5 ))    # multiple operations require a comma separator
Run Code Online (Sandbox Code Playgroud)

如果你这样做help "((",说双括号是"等价于" let EXPRESSION"."

您可以使用declare内置来进行分配,包括间接:

blue=2
name=blue
declare $name=4
echo $blue    # result: 4
echo ${!name} # result: 4
Run Code Online (Sandbox Code Playgroud)

编辑:

$(())构造称为" 算术扩展 ",并将内容作为整数表达式进行求值.它是shell的语法元素.

如果变量声明为整数,则不需要使用任何形式的双括号,可以省略变量名称中的美元符号(如双括号表单中所示),但不能在运算符周围添加空格:

declare -i x=1   # set integer, initialize to 1
declare +i s=1   # clear integer, initialize to 1
x+=1             # could also be x=x+1
echo $x          # result: 2 (addition)
s+=1             # could also be s=$s+1, requires a "$"
echo $s          # result: 11 (string concatenation)
Run Code Online (Sandbox Code Playgroud)

与上面的表单不同,调用expr涉及产生外部可执行文件,这对于循环中的大量计算来说可能非常昂贵.它应该被使用的唯一时间是在脚本无法进行自己的算术运算或者脚本可能进入这样的环境时可移植性的环境中.POSIX shell具有算术功能,因此只关注旧系统.

关于bc浮点运算的使用,当使用Bash和许多其他shell时,需要它或类似的东西.POSIX说"只需要签名的长整数运算."

支持浮点数学的两个shell是ksh和zsh.除此之外bc,您还可以dc在Bash脚本中使用AWK,Python,Perl等.

Bash 使用浮点数进行的一件事是使用printf内置函数打印它们(请注意,还有一个外部printf,但内置函数具有优先级).

printf "%'14.4f\n" 1234.56  # result "    1,234.5600" (in my locale)
Run Code Online (Sandbox Code Playgroud)


Car*_*rum 5

我更喜欢你的第二个选项,因为它不需要外部工具:

result=$(( 1 + 2 ))
Run Code Online (Sandbox Code Playgroud)

第一个选择要求expr做数学 - 我不熟悉let.另一个替代方案bcdc.选择你最喜欢的.