函数调用者位置参数

函数调用者位置参数

我需要读取和写入$@函数调用者的位置参数。 Bash 手册页说:

shell 函数是一个像简单命令一样调用的对象,并使用一组新的位置参数执行复合命令

所以$@每次调用都会重写。我寻找一些“特殊参数”但一无所获。 shell 变量BASH_ARGV似乎解决了我的问题,但是它需要shopt -s extdebug启用,这不是我机器中的默认行为,也不像在生产中打开的选项。

extdebug
    If set, behavior intended for use by debuggers is enabled:
    ...
    4.     BASH_ARGC and BASH_ARGV are updated as described in their
           descriptions above.
    ...

$@Bash 是否能够在不使用 的情况下读取或写入函数的调用者BASH_ARGV?您是否认为 Bash 受到限制并使用其他 shell 来编写脚本?

编辑:我想要getopt在我的助手库中有一个精美的包装器。因此与其相关的所有行为都在一个函数内。无需检查错误或set --.

答案1

函数不能影响其调用者的位置参数。这是设计使然:位置参数对于函数来说是私有的。

让你的函数在数组上工作。

myfunction () {
  local _myfunction_arrayname=$1
  shift
  … # work on the positional parameters
  eval "$_myfunction_arrayname=(\"\$@\")"
}
myfunction foo "$@"
set -- "${foo[@]}"

在 ksh93 和 bash 中,有一种迂回的方法可以通过将别名和.( source) 内置函数与进程替换相结合来完成某些操作。例子

alias myfunction='. <(echo myfunction_body \"\$@\"; echo set -- "\"\${new_positional_parameters[@]}\"")'

将函数的主要工作放入myfunction_body并使其设置数组new_positional_parameters。调用 后,位置参数将设置为放入 中myfunction的值。myfunction_bodynew_positional_parameters

答案2

这是一些循环遍历参数的代码,根据需要更新每个参数。在这种情况下,将重复的斜杠替换为单个斜杠:

for param
do
    param="$(printf %s. "$1" | tr -s "/")"
    set -- "$@" "${param%.}"
    shift
done

相关内容