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

时间:2019-03-26 12:22:54

标签: linux bash positional-parameter

假设我有一些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开始计数。

我该如何实现?

3 个答案:

答案 0 :(得分:2)

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

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

还请注意,在切片列表时,$#的最后一个参数是可选的。没有同样的理解,最终将取决于最终的位置论证。

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

答案 1 :(得分:1)

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

答案 2 :(得分: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" "$@"
}