我正在尝试getopts
在 bash 中使用处理命令行参数。要求之一是处理任意数量的选项参数(不使用引号)。
第一个示例(仅获取第一个参数)
madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a
第二个例子(我希望它的行为像这样,但不需要引用参数”
madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c
有没有办法做到这一点?
这是我现在的代码:
#!/bin/bash
while getopts ":s:" opt; do
case $opt in
s) echo "-s was triggered" >&2
args="$OPTARG"
echo "Argument: $args"
;;
\?) echo "Invalid option: -$OPTARG" >&2
;;
:) echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
请注意,我想以这种方式支持多个标志,例如
madcap:~/projects$ ./getoptz.sh -s a b c -u 1 2 3 4
-s was triggered
Argument: a b c
-u was triggered
Argument: 1 2 3 4
答案1
我认为最好的方法是对每个参数使用 -s ,-s foo -s bar -s baz
即但如果您仍然想支持单个选项的多个参数,我建议您不是使用getopts
。
请看一下下面的脚本:
#!/bin/bash
declare -a sargs=()
read_s_args()
{
while (($#)) && [[ $1 != -* ]]; do sargs+=("$1"); shift; done
}
while (($#)); do
case "$1" in
-s) read_s_args "${@:2}"
esac
shift
done
printf '<%s>' "${sargs[@]}"
当-s
检测到时,read_s_args
将使用命令行上的其余选项和参数来调用。read_s_args
读取其参数,直到到达下一个选项。 -s 的有效参数存储在sargs
数组中。
这里有一个样本输出:
[rany$] ./script -s foo bar baz -u a b c -s foo1 -j e f g
<foo> <bar> <baz> <foo1>
[rany$]