getopts 超过 4 个解析器参数

getopts 超过 4 个解析器参数

我想使用下面的代码在脚本getopts中解析多个参数。bash

while getopts b:B:m:M:T flag
do
    case "${flag}" in
        b) rbmin=${OPTARG};;
        B) rbmax=${OPTARG};;
        m) mbmin=${OPTARG};;
        M) mbmax=${OPTARG};;
        T) sigType=${OPTARG};;
    esac
done
echo $rbmin,$rbmax,$mbmin,$mbmax, $sigType
[amit@amitk]$ sh pass.sh -b 0.1 -B 0.3  -m 10 -M 11 -T sig 
0.1,0.3,10,11,

我不知道为什么我不能通过超过四个参数。有什么建议么?

答案1

您似乎缺少提供给 的选项字符串中的:after 。这表明需要一个选项参数。Tgetopts:-T

如果没有:,-T将是一个没有参数的选项,并且您的调用将sig作为操作数留在命令行末尾,而不是作为选项参数。

while getopts b:B:m:M:T: flag
do
    case $flag in
        b) rbmin=$OPTARG        ;;
        B) rbmax=$OPTARG        ;;
        m) mbmin=$OPTARG        ;;
        M) mbmax=$OPTARG        ;;
        T) sigType=$OPTARG      ;;
        *) echo error >&2
           exit 1
    esac
done
shift "$(( OPTIND - 1 ))"

echo "$rbmin,$rbmax,$mbmin,$mbmax, $sigType"

if [ "$#" -gt 0 ]; then
        printf 'Other operands: %s\n' "$*"
fi

测试:

$ sh script -b 0.1 -B 0.3  -m 10 -M 11 -T sig
0.1,0.3,10,11, sig
$ sh script -b 0.1 -B 0.3  -m 10 -M 11 -T sig hello bumblebee
0.1,0.3,10,11, sig
Other operands: hello bumblebee

另请注意,如果您使用显式解释器(例如 )来运行脚本sh,则可能不会使用 来运行脚本bash。我只是提到这一点,因为您bash在问题中提到了“脚本”。在这种情况下,没关系,因为脚本没有要求 bash,但最好使用#!顶部带有正确行的可执行文件。

相关内容