在 Bash 中,let 允许在一行中进行多个赋值:
let a=3 b=4 c=5
正如您在问题中显示的那样,引用 let 的参数允许您在运算符周围放置空格。但是,如果您避免使用空格,则可以省略引号。
在语句开头使用双括号的另一种形式(而不是 i=$((j + 1)) 形式)允许您在等号周围包含空格或执行后置或前置递增或递减以及额外的赋值操作:
(( a = ( b + c ) * 4 ))
(( count++ ))
(( d = --c**2 ))
(( e *= 2 ))
(( f = 3, g = 5 )) # multiple operations require a comma separator
如果您使用help "((",则表示双括号“等效于“let EXPRESSION”。”
您可以使用 declare 内置函数进行赋值,包括间接赋值:
blue=2
name=blue
declare $name=4
echo $blue # result: 4
echo ${!name} # result: 4
编辑:
$(()) 构造被称为“arithmetic expansion”,它使内容被计算为一个整数表达式。它是 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)
与上面的表格不同,调用expr 涉及生成一个外部可执行文件,这对于循环中的大量计算可能非常昂贵。 唯一 应该使用它的时间是在 shell 无法进行自己的算术运算的环境中,或者当脚本可能会进入这样的环境时的可移植性。 POSIX shell 具有算术能力,因此只有旧系统才需要考虑。
关于使用bc 进行浮点运算,在使用 Bash 和许多其他 shell 时需要它或类似的东西。 POSIX 说“只需要有符号长整数运算。”
支持浮点数学的两个 shell 是 ksh 和 zsh。除了 bc,您还可以在 Bash 脚本中使用 dc、AWK、Python、Perl 等。
Bash 将对浮点数做的一件事是使用内置的 printf 打印它们(请注意,还有一个外部的 printf,但内置有优先级)。
printf "%'14.4f\n" 1234.56 # result " 1,234.5600" (in my locale)