繁体   English   中英

算术展开的顺序

[英]Order of arithmetic expansion

考虑以下:

for i in 1 2 3; do echo $(( j += 1 ))& done

根据(我阅读的) sh 语言规范第 2.3 节第 5 段, j += 1的算术扩展应该在令牌识别期间进行,因此应该在 shell 读取&之前进行处理。 所以看起来执行上面的行应该将j增加 3,并且每次调用 echo 应该得到一个不同的参数。 (如果 '&' 被 ';' 替换,这就是行为)。 bash 3.2.25中j没有修改。 这是 bash 中的错误,还是我误解了什么?

整个令牌识别部分处理parsing ,而不是任何类型的扩展或命令评估。 查看上下文的“介绍” - 解析基本上在所有事情之前进行,而算术表达式的评估通常是最后的评估步骤之一。 它在这里并不真正相关。

您可能真的想知道扩展是否发生在异步列表的子 shell 分叉之前。 他们没有。

 $ ksh93 -c 'typeset -i n; while ((++j%10)); do { n+=1; printf "$n "; } & done; while ((++j%10)); do : $((n++)) ${ printf "$n " >&2;} & done 2>&1; echo'
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 $
 $ bash -c 'f() { printf "#%d %s, %s\n" "$@"; }; f 1 $BASHPID $$; f 2 $BASHPID $$ & sleep 1'      
#1 12275, 12275
#2 12276, 12275
 $

至于展开的顺序,算术展开与参数展开和命令替换同时进行,从左到右(也如上图第二个循环)。

我认为您不是唯一误读该部分的人,我已经提交了一些与之相关的错误,这些错误要么是我的错误,要么是由于与非 POSIX shell 扩展的一些不幸交互。 恕我直言,该部分过于简洁。

如果您认为规范语言或实现有问题,您可能会在其中一个邮件列表中找到更好的答案。 ast-users , help-bash , austin 组列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM