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 扩展有明确的顺序:算术扩展在参数扩展之后执行。
有人能解释一下这里发生了什么吗?
答案1
这与我对 GNU bash 手册的理解相矛盾,该手册指出 bash 扩展有明确的顺序:在参数扩展之后执行算术扩展。
事实并非如此man bash
。仔细读:
展开的顺序是:大括号展开;波形符扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和路径名扩展。
请注意逗号和分号的使用。波形符、参数、变量和算术扩展以及命令替换都发生在同一级别,从左到右,与观察到的行为一致。
FWIW,POSIX 文本在其相应部分具有更清晰的格式。它说:
单词扩展的顺序如下:
应从头到尾执行波形符扩展、参数扩展、命令替换和算术扩展。请参阅令牌识别中的第 5 项。
除非 IFS 为空,否则应对步骤 1 生成的字段部分进行字段拆分。
除非 set -f 有效,否则应执行路径名扩展。
报价删除应始终最后执行。