我知道如何在Bash中使用getopts处理可选参数
#!/bin/bash
while getopts ":a:p:drh" opt; do
case "$opt" in
a) echo $OPTARG;;
esac
done
但如果我的脚本需要./script.sh arg1 [options]
,我如何告诉getopts
跳过arg1?
$ ./script.sh -a 1234
1234
$ ./script.sh arg1 -a 1234
$ ./script.sh arg1
$ ./script.sh -a 1234 arg1
1234
正如我所见,如果论证放在最后一个位置,我可以处理这个论点。我需要在getopts
中使用什么“正则表达式”来允许我的位置参数位于可选参数的前面?
来自How to allow non-option arguments in any order to getopt?的建议似乎正在重新排序这些论点。
答案 0 :(得分:4)
我是这样做的。您可以在任何地方放置多个非可选参数。
#!/bin/bash
while [ $# -gt 0]; do
while getopts ":a:p:drh" opt; do
case "$opt" in
a) echo $OPTARG; shift;;
p) echo $OPTARG; shift;;
d) echo Option d;;
r) echo Option r;;
h) echo Option h;;
\?) echo unknown Option;;
:) echo missing required parameter for Option $OPT;;
esac
shift
OPTIND=1
done
if [ $# -gt 0 ]; then
POSITIONALPARAM=(${POSITIONALPARAM[@]} $1)
shift
OPTIND=1
fi
done
echo ${POSITIONALPARAM[@]}
内部循环解析参数。每当遇到非选项参数时,它将退出内部循环。外部循环将获取下一个非选项参数。在删除非选项参数后,内循环将接收,然后继续读取下一个可选参数,依此类推。
当Chrono Kitsune建议我解释时,移位会移除第一个参数(可选或不可选)并将所有位置向左移动。 $1
被删除,$2
变为$1
,$3
变为$2
等等。这使脚本能够控制移动非可选参数,直到它变为$1
。
shift
和重置OPTIND
都可以实现这一目标。感谢Chrono Kitsune建议将OPTIND重置为1而不是0。
./sample.bash -a one -p two more -d sample
输出:
one
two
Option d
more sample
现在让我们用不同位置的参数调用脚本。
./sample.bash more -a one -p two -d sample
输出:
one
two
Option d
more sample
答案 1 :(得分:1)
如果您知道位置参数的数量,那么您可以执行以下操作:
#!/bin/bash
VAR=$1
shift
echo $VAR
while getopts ":a:p:drh" opt; do
case "$opt" in
a) echo $OPTARG;;
esac
done
示例:
> ./test.sh mist -a 2345 -p 45
mist
2345