Answers:
所有这些都处理算术,但是方式不同,并且变量是通过不同的方式创建的。其中一些特定于bash
外壳,而另一些则不是。
$((...))
称为算术扩展,这是bash
and ksh
外壳的典型特征。这允许执行简单的整数运算,但是没有浮点数。表达式的结果将替换表达式,如echo $((1+1))
将成为echo 2
((...))
被称为算术评估,可以用作if ((...)); then
或while ((...)) ; do
语句的一部分。算术扩展扩展可$((..))
替代操作的输出,可用于分配变量,i=$((i+1))
但不能在条件语句中使用。$[...]
是不推荐使用的旧算法扩展语法。另请参阅。这可能会保留下来,以便旧bash
脚本不会中断。这在中不起作用ksh93
,所以我的猜测是该语法是bash特定的。注意:这里的空格非常重要;不要混淆$[1+1]
诸如此类的东西[ $a -eq $b ]
。在[
与空间是被称为test
命令,你通常会看到它在决策部分。在行为和目的上有很大的不同。let
是bash
and ksh
关键字,它允许通过简单的算术评估创建变量。如果您尝试在其中分配字符串,则可能let a="hello world"
会遇到语法错误。在bash
和中工作ksh93
。$(...)
是命令替换,在这里您可以从字面上获取命令的输出并分配给变量。您的命令是expr
,它接受位置参数,例如expr arg1 arg2 arg3
,因此空格很重要。它有点像一个用于整数运算的小型命令行计算器,外加一些true / false和regex类型的东西。这是一个与外壳无关的命令。还值得注意的是,算术扩展和命令替换是由POSIX标准指定的,而let
和$[...]
不是。
由于上面的一些答案特别提到,ksh93
因此值得注意的是,它可以进行浮点运算,例如:
$ print $((1.0/3))
0.333333333333333333
您可以使用printf控制输出的精度,例如:
$ printf "%.4f\n" $((1.0/3))
0.3333
如上所述,必须至少指定一个参数作为浮点数。如果两个都指定为整数,则仅完成整数数学运算,例如:
$ print $((1/3))
0
当您需要在Shell脚本中进行浮点运算时,这将很有帮助,因为可以避免调用外部命令。
zsh
答案。因为ksh
和bash
彼此之间(通常)比彼此更相似zsh
,所以在我看来,kh93
基于该问题的答案可能非常有用。
((...))
实际上,可用于在分配bash
,ksh
和zsh
:n=10; ((n+=10)); echo $n
打印20和((x=1)); echo $x
打印1.