我需要读取和写入$@
函数调用者的位置参数。 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_body
new_positional_parameters
答案2
这是一些循环遍历参数的代码,根据需要更新每个参数。在这种情况下,将重复的斜杠替换为单个斜杠:
for param
do
param="$(printf %s. "$1" | tr -s "/")"
set -- "$@" "${param%.}"
shift
done