1

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

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

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

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

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

所以是这样的:

foo value1 value2 --arg3 value3 --arg4 value4

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

我怎样才能做到这一点?

4

3 回答 3

2

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

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

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

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

于 2019-03-26T12:30:47.783 回答
1

$@确实是 Bash 中的一个数组,因此您可以使用以下语法访问任意项目(项目)${@:start:length}

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

在这里,当length省略时,假设它足够长以包含所有剩余的项目。

shift然后使用$@是另一种选择:

function foo() {
  arg1="$1"
  arg2="$2"
  shift 2
  python3 script.py --arg1 "$arg1" --arg2 "$arg2" "$@"
}
于 2019-03-26T12:28:53.543 回答
1

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

于 2019-03-26T12:25:07.097 回答