Shell 是:GNU bash,版本 5.1.16(1)-release (x86_64-pc-linux-gnu)
我正在考虑以下命令行:
a=1; echo $a$((a=2))$a
输出是:
122
我推断扩展是按以下顺序处理的:
- 变量
a
被赋值1
; - 第一个
$a
是通过参数扩展来扩展的a=1
$((a=2))
然后执行 算术展开 ,设置a
为2
,- 然后用算术扩展时设置的
$a
新值扩展第二个值。a
2
如果我的理解是正确的,那么处理顺序意味着 shell 在进行算术扩展后返回到参数扩展。
这与我对 GNU bash 手册的理解相矛盾,该手册指出 bash 扩展有明确的顺序:算术扩展在 oarameter 扩展之后执行。
有人能解释一下这里发生了什么吗?
事实并非如此
man bash
。仔细读:请注意逗号和分号的使用。波形符、参数、变量和算术扩展以及命令替换都发生在同一级别,从左到右,与观察到的行为一致。
FWIW,POSIX 文本在其相应部分具有更清晰的格式。它说: