在POSIX sh中迭代位置参数时修改位置参数 [英] Modifying positional parameters while iterating over them in POSIX sh
本文介绍了在POSIX sh中迭代位置参数时修改位置参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是便携的吗?
filter() {
set -- CUT "$@"
for x; do
if test "$x" = CUT; then
set -- # ignore args upto here
else # perhaps more filtering
set -- "$@" "$x"
fi
done
printf "'%s' " "$@"; echo
}
filter "$@"
即我可以在迭代时更改"$@"
吗?for
复合是否复制隐式数组?
filter 1 2 CUT 3
似乎适用于dash
、ash
、busybox sh
。
posix
可以,推荐答案确实允许这样做。从标题为The for Loop(下面引用,重点是我的)的部分可以推断,循环保留了它要迭代的项目列表的自己的私有副本,并且在执行循环时对shell执行环境所做的更改不会对所述副本产生任何影响。
for name [ in [word ... ]] do compound-list done
首先展开
in
后面的单词列表,生成项目列表。然后依次为每一项设置变量name
,每次执行compound-list
。 省略:in word...
等同于:
in "$@"
换句话说,因为"$@"
的隐式展开在set --
和set -- "$@" "$x"
之前,所以可以保证程序中的循环迭代位置参数的初始列表。
这篇关于在POSIX sh中迭代位置参数时修改位置参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文