在 bash 中使用 getopts 的多个选项参数

在 bash 中使用 getopts 的多个选项参数

我正在尝试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$]

相关内容