【问题标题】:bash function with three to infinitely arguments具有三个到无限参数的 bash 函数
【发布时间】: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}" 这样的东西。你可以尝试一下

标签: linux bash positional-parameter


【解决方案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" "$@"
      }
      

      【讨论】:

        猜你喜欢
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 2017-08-29
        相关资源
        最近更新 更多