echo $a$((a=2))$a 中参数扩展和算术扩展之间的动态

echo $a$((a=2))$a 中参数扩展和算术扩展之间的动态

Shell 是:GNU bash,版本 5.1.16(1)-release (x86_64-pc-linux-gnu)

我正在考虑以下命令行:

a=1; echo $a$((a=2))$a

输出是:

122

我推断扩展是按以下顺序处理的:

  1. 变量a被赋值1
  2. 第一个$a是通过参数扩展来扩展的a=1
  3. $((a=2)) 然后执行 算术展开 ,设置a 为 2
  4. 然后,第二个用算术扩展中设置的$a新值进行扩展。a2

如果我的理解是正确的,那么处理顺序意味着 shell 在进行算术扩展后返回到参数扩展。

这与我对 GNU bash 手册的理解相矛盾,该手册指出 bash 扩展有明确的顺序:算术扩展在参数扩展之后执行。

有人能解释一下这里发生了什么吗?

答案1

这与我对 GNU bash 手册的理解相矛盾,该手册指出 bash 扩展有明确的顺序:在参数扩展之后执行算术扩展。

事实并非如此man bash。仔细读:

展开的顺序是:大括号展开;波形符扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和路径名扩展。

请注意逗号和分号的使用。波形符、参数、变量和算术扩展以及命令替换都发生在同一级别,从左到右,与观察到的行为一致。


FWIW,POSIX 文本在其相应部分具有更清晰的格式。它说:

单词扩展的顺序如下:

  1. 应从头到尾执行波形符扩展、参数扩展、命令替换和算术扩展。请参阅令牌识别中的第 5 项。

  2. 除非 IFS 为空,否则应对步骤 1 生成的字段部分进行字段拆分。

  3. 除非 set -f 有效,否则应执行路径名扩展。

  4. 报价删除应始终最后执行。

相关内容