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

Posted

技术标签:

【中文标题】具有三个到无限参数的 bash 函数【英文标题】:bash function with three to infinitely arguments 【发布时间】:2019-08-16 19:58:26 【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

不确定,但我闻起来像 '$@' 是一个数组,所以你可以从第 5 位开始索引它。像"$$@:5" 这样的东西。你可以尝试一下 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

$@ 确实是 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" "$@"

【讨论】:

以上是关于具有三个到无限参数的 bash 函数的主要内容,如果未能解决你的问题,请参考以下文章

Bash参数解析逻辑陷入无限循环[重复]

具有无限参数的 Java 方法

如何从输出到前景的Bash脚本运行无限循环

创建具有无限参数的方法?

react 实现一个无限循环的轮播器 附github地址

使用三个视图的无限循环分页 UIScrollView