具有三个到无限参数的 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 函数的主要内容,如果未能解决你的问题,请参考以下文章