这三种赋值方式有什么区别吗:a=1,让a=1, ((a=1))



考虑赋值的三种方法:

#!/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 ))

最新更新