getopts将选项视为前一个选项的参数

时间:2013-04-21 14:50:34

标签: bash getopts

我有以下脚本:

#!/bin/bash

USER="NONE"
LOST=0
AVG=0

while getopts ":pmu:" OPTION; do
    case $OPTION in
        u)
            USER=$OPTARG
            ;;
        p)
            LOST=1
            ;;
        m)
            AVG=1
            ;;
        \?)
            echo "Invalid argument: -$OPTARG"
            exit 1
            ;;
        :)
            echo "-$OPTARG requires an argument."
            exit 1
            ;;
    esac
done

echo "$USER-$LOST-$AVG"

exit 0

我希望-u选项接受一个参数。该脚本正确识别无效选项,并在没有参数的情况下调用-u。但不幸的是,当我输入:

myscript -u -m -p

打印:

-m-1-0

因此,它使用-m作为-u参数,并忽略-m选项本身。

1 个答案:

答案 0 :(得分:2)

你告诉getopts -u选项之后是一个选项参数。 -m是一个字符串值;它以-符号开头的事实对于它作为选项参数的状态并不重要;您可以在选项参数值的开头使用-

所以,你的观察是正确的。这是预期的设计;这是getopt()函数的工作方式,它是POSIX Utility Syntax Guidelines的实现 - 实际上是这些指南的略微宽松的版本。如果您不喜欢它,请使用getopts以外的其他内容,但您将与系统作斗争。

请注意,尽管POSIX getopt()在理论上允许“可选的选项 - 参数”,但实际上,只有命令行上的最后一个选项可以有一个可选的选项参数,这使它们基本上无用。

完全可以设计出行为不同且基本满足效用语法指南的选项解析系统;很多人都做到了。实际上,GNU getopt程序是一个扩展实现,很可能是你应该看到的 - 但它有一个非常不同的调用来实现这种行为(另见Using getopts in bash shell script to get long and short command line options)。系统都是不同的,并且通常简洁地描述所需的选项处理行为通常是复杂的。有关详细信息,请参阅Solaris CLIP — Command Line Interface Paradigm *

* Google搜索字词'solaris clip'为您提供电影'Solaris'的电影剪辑。工作搜索术语是“Solaris命令行界面范例”。