POSIX sh中迭代位置参数时修改参数的做法是否具备可移植性?
回答
1. 迭代过程修改"$@"的合法性
该操作完全合法。POSIX规范未限制set --修改位置参数的执行时机,允许在包括循环内部的任意代码位置修改当前作用域的位置参数列表。
2. for循环的参数列表快照行为
是的,for循环会对隐式参数数组做快照拷贝,迭代过程不会受后续参数修改的影响。
POSIX规范明确规定:当for循环省略in <wordlist>部分时,会在循环启动前一次性展开当前的位置参数,生成固定的遍历序列,后续所有对$@的修改都不会影响已经确定的迭代项,该行为是通用标准要求,并非某款shell的私有实现特性。
3. 写法的可移植性判定
该写法完全符合POSIX规范,具备跨实现的可移植性。你测试的dash、ash、busybox sh都是严格遵循POSIX的轻量shell实现,其余所有兼容POSIX的shell(包括ksh、mksh、zsh的POSIX兼容模式等)都会按预期执行该代码,无兼容性风险。
补充说明:你当前的实现逻辑等价于提取所有位于
CUT标记之后的位置参数,如果要新增更多过滤规则,直接在else分支中添加判断条件、决定是否要将$x追加到新的位置参数列表即可,相关操作依然符合POSIX规范。
内容的提问来源于stack exchange,提问作者usretc
相关产品推荐
相关产品推荐

