bash 具有三个到无限个参数的函数
bash function with three to infinitely arguments
假设我有一些 python argparse 脚本,我想使用 bash 函数作为别名。
让我们假设这个 python 脚本有四个参数:
--arg1
--arg2
--arg3
--arg4
我想实现的是在固定位置取前两个参数,然后无限添加可选参数。
function foo() { python3 script.py --arg1 "" --arg2 "" "$@"; }
所以像这样:
foo value1 value2 --arg3 value3 --arg4 value4
但是,$@ 从 1 开始计数。
我怎样才能做到这一点?
将</code>和<code>
保存到局部变量,然后使用shift
将变量移过来,这样$@
就不再包含它们了。
$@
确实是Bash中的一个数组,所以可以通过语法${@:start:length}
:
访问任意一个(items)项
function foo() {
python3 script.py --arg1 "" --arg2 "" "${@:3}"
}
此处,当省略 length
时,假定它的长度足以包含所有剩余项。
shift
然后使用 $@
是替代方法:
function foo() {
arg1=""
arg2=""
shift 2
python3 script.py --arg1 "$arg1" --arg2 "$arg2" "$@"
}
将第二个之后的位置参数数组切片到列表的其余部分,如下所示。还要从定义中删除非标准关键字 function
。
foo() {
python3 script.py --arg1 "" --arg2 "" "${@:3:$#}"
}
另请注意,$#
的最后一个参数在对列表进行切片时是可选的。没有相同的理解,结束取决于最终的位置参数。
此外,如果添加更多位置参数或更改参数顺序,这种参数解析方式可能会变得棘手。为了更有效地解析参数,请考虑使用 getopts
(其等效的 Python 模块)。
假设我有一些 python argparse 脚本,我想使用 bash 函数作为别名。
让我们假设这个 python 脚本有四个参数:
--arg1
--arg2
--arg3
--arg4
我想实现的是在固定位置取前两个参数,然后无限添加可选参数。
function foo() { python3 script.py --arg1 "" --arg2 "" "$@"; }
所以像这样:
foo value1 value2 --arg3 value3 --arg4 value4
但是,$@ 从 1 开始计数。
我怎样才能做到这一点?
将</code>和<code>
保存到局部变量,然后使用shift
将变量移过来,这样$@
就不再包含它们了。
$@
确实是Bash中的一个数组,所以可以通过语法${@:start:length}
:
function foo() {
python3 script.py --arg1 "" --arg2 "" "${@:3}"
}
此处,当省略 length
时,假定它的长度足以包含所有剩余项。
shift
然后使用 $@
是替代方法:
function foo() {
arg1=""
arg2=""
shift 2
python3 script.py --arg1 "$arg1" --arg2 "$arg2" "$@"
}
将第二个之后的位置参数数组切片到列表的其余部分,如下所示。还要从定义中删除非标准关键字 function
。
foo() {
python3 script.py --arg1 "" --arg2 "" "${@:3:$#}"
}
另请注意,$#
的最后一个参数在对列表进行切片时是可选的。没有相同的理解,结束取决于最终的位置参数。
此外,如果添加更多位置参数或更改参数顺序,这种参数解析方式可能会变得棘手。为了更有效地解析参数,请考虑使用 getopts
(其等效的 Python 模块)。