了解 "let" 命令

Understanding the "let" command

来自 this tutorial 我正在查看第一个示例,无法弄清楚为什么 b 会设置为 2

$ let 'b = a' "(a += 3) + $((a = 1)), b++"
$ echo "$a - $b - $?"
4 - 2 - 0

根据我的理解,let 从左到右评估命令。因此,b=a 被评估,但由于 a 一开始是空白的,这评估为 0,我用

测试过
$ let 'b=a'
$ echo $b
0

接下来,a += 3,由于 a 为空,计算结果为 3,但随后我们添加 $((a = 1)),这对我来说似乎是设置 a 回到 1。最后我们将 1 添加到 b。我希望输出为 1 - 1 - 0。但是,由于输出是 4 - 2 - 0,在我看来 $((a = 1)) 是第一个执行的语句。有人可以解释为什么会这样吗?

您的教程说明 Remember that inside arithmetic evaluation contexts, all other expansions are processed as usual (from left-to-right), and the resulting text is evaluated as an arithmetic expression.
S 首先处理所有其他扩展(具有 $(something) 的子外壳),然后将结果文本计算为算术表达式。

bash 在传递给命令之前解析给定的参数。在这种情况下,$() 部分会在初始解析期间进行评估。 a 的值设置为 1 并且整个部分替换为 1。因此 let 看到:

b = a (a += 3) + 1, b++

and a is already 1 before that executes.