在POSIX sh中迭代位置参数时修改位置参数 [英] Modifying positional parameters while iterating over them in POSIX sh

查看:31
本文介绍了在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

似乎适用于dashashbusybox 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆