假设我有一些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开始计数。
我该如何实现?
答案 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" "$@"
}