【问题标题】:Modifying positional parameters while iterating over them in POSIX sh在 POSIX sh 中迭代位置参数时修改位置参数
【发布时间】:2021-09-06 23:13:16
【问题描述】:

这是便携的吗?

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 中工作。

【问题讨论】:

    标签: shell sh posix


    【解决方案1】:

    是的,POSIX 确实允许这样做。可以从标题为The for Loop 的部分推断出(在下面引用,强调我的)循环保留了它自己要迭代的项目列表的私有副本,并且在循环执行时对 shell 执行环境进行了更改执行不会对所述副本产生任何影响。

    for name [ in [word ... ]]
    do
      compound-list
    done
    

    首先,in 之后的单词列表将被扩展以生成项目列表。 然后,变量name 应依次设置为每个项目,@ 987654325@ 每次执行。 省略:

    in word...
    

    应相当于

    in "$@"
    

    换句话说,因为"$@" 的隐含扩展先于set --set -- "$@" "$x",所以可以保证程序中的循环遍历位置参数的初始列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 2011-05-27
      • 2014-10-22
      • 2017-11-20
      • 1970-01-01
      相关资源
      最近更新 更多