考虑赋值的三种方法:
#!/bin/bash
a=1
let a=1
((a=1))
三个作业是否完全相等?
如果您的shell有非posix扩展(即。(ksh或bash),它们是完全等价的:a=1
是字符串赋值,而let a=1
和(( a=1 ))
是数字赋值,但是在a
中存储的是一个字符串,在每种情况下都表示数字1
。
$(( ))
是posix兼容的创建数学上下文的方式。相比之下,(( ))
和let
不是POSIX指定的,而是一些shell中可用的超出标准的扩展。
现在,考虑:
b=2
# result | posix? | type | comments
# --------+---------+--------------------+----------------
a=b # a=b | true | string assignment |
let a=b # a=2 | false | numeric assignment | ancient non-POSIX syntax
a=$((b)) # a=2 | true | numeric assignment | modern POSIX syntax
((a=b)) # a=2 | false | numeric assignment | modern non-POSIX extension
对于给定的操作数,它们是相同的。然而,let
除了简单的赋值之外,还有一些额外的特性。首先,在算术上下文中处理赋值的右侧。比较
$ a=1+1; echo $a
1+1
$ let a=1+1; echo $a
2
此外,作为一个命令,let
的参数在赋值之前由shell处理,允许您动态声明参数。
$ a=b
$ let $a=5
$ echo $b
5
对于$((...))
或((...))
也是如此:
$ a=b
$ : $(( $a = 5 )) # or (( $a = 5))
$ echo $b
5
与任何命令参数一样,特殊字符需要加引号:
$ let "a = 3 * 5"; echo $a
15
这并不适用于$(( ... ))
或(( ... ))
。
$ a=$(( 3 * 5 ))
$ (( a = 3 * 5 ))