函数调用者位置参数

Ped*_*rda 6 shell bash parameter function shopt

我需要读取和写入$@函数调用者的位置参数。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.
    ...
Run Code Online (Sandbox Code Playgroud)

Bash 是否能够在$@没有 的情况下读取或写入函数的调用者BASH_ARGV?您是否认为 Bash 受到限制并使用另一个 shell 进行脚本编写?

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

Gil*_*il' 2

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

\n\n

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

\n\n
myfunction () {\n  local _myfunction_arrayname=$1\n  shift\n  \xe2\x80\xa6 # work on the positional parameters\n  eval "$_myfunction_arrayname=(\\"\\$@\\")"\n}\nmyfunction foo "$@"\nset -- "${foo[@]}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
alias myfunction=\'. <(echo myfunction_body \\"\\$@\\"; echo set -- "\\"\\${new_positional_parameters[@]}\\"")\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n