0

我有以下脚本:

#!/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选项本身。

4

1 回答 1

2

您告诉getopts-u选项后跟一个选项参数。 -m是一个字符串值;它以符号开头的事实-对其作为选项参数的地位无关紧要;您可以-在选项参数值的开头使用。

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

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

完全有可能设计出行为不同且基本满足实用程序语法指南的选项解析系统;许多人已经做到了。事实上,GNUgetopt程序是一个扩展的实现,这可能是您应该看到的——但它有一个非常不同的调用来获得行为(另请参阅在 bash shell 脚本中使用getopts来获取长短命令行选项)。这些系统都是不同的,并且简洁而明确地描述所需的选项处理行为通常很复杂。有关详细信息,请参见Solaris CLIP — 命令行界面范例*

* Google 搜索词“solaris clip”为您提供电影“Solaris”的电影剪辑。一个有效的搜索词是“Solaris 命令行界面范例”。

于 2013-04-21T14:59:16.100 回答