bash 具有三个到无限个参数的函数

bash function with three to infinitely arguments

假设我有一些 python argparse 脚本,我想使用 bash 函数作为别名。

让我们假设这个 python 脚本有四个参数:

--arg1
--arg2
--arg3
--arg4

我想实现的是在固定位置取前两个参数,然后无限添加可选参数。

function foo()  {  python3 script.py --arg1 "" --arg2 "" "$@";  }

所以像这样:

foo value1 value2 --arg3 value3 --arg4 value4

但是,$@ 从 1 开始计数。

我怎样才能做到这一点?

</code>和<code>保存到局部变量,然后使用shift将变量移过来,这样$@就不再包含它们了。

$@确实是Bash中的一个数组,所以可以通过语法${@:start:length}:

访问任意一个(items)项
function foo() {
  python3 script.py --arg1 "" --arg2 "" "${@:3}"
}

此处,当省略 length 时,假定它的长度足以包含所有剩余项。

shift 然后使用 $@ 是替代方法:

function foo() {
  arg1=""
  arg2=""
  shift 2
  python3 script.py --arg1 "$arg1" --arg2 "$arg2" "$@"
}

将第二个之后的位置参数数组切片到列表的其余部分,如下所示。还要从定义中删除非标准关键字 function

foo() {  
   python3 script.py --arg1 "" --arg2 "" "${@:3:$#}"
}

另请注意,$# 的最后一个参数在对列表进行切片时是可选的。没有相同的理解,结束取决于最终的位置参数。

此外,如果添加更多位置参数或更改参数顺序,这种参数解析方式可能会变得棘手。为了更有效地解析参数,请考虑使用 getopts(其等效的 Python 模块)。