getopts:无法识别参数

时间:2017-10-23 05:41:30

标签: linux shell unix getopt

这是我试过的脚本:

#!/bin/bash
while getopts ":u:p:" option; do
        case $option in
                u) USER=$OPTARG;;
                p) PASS=$OPTARG;;
                \?) echo "Invalid Option: $OPTARG"
                    exit 1;;
                :) echo "Please provide an argument for $OPTARG!"
                   exit 1;;
        esac
done
echo "Username/Password: $USER/$PASS"

如果运行脚本的命令是:

./test9.sh -u test -p -a

然后我得到一个输出:

Username/Password: test/-a

-a是无效参数,但脚本将-a作为密码。我想显示一条消息Please enter a password并退出脚本。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

有三种参数:选项,选项参数和位置参数。如果参数是需要参数的选项,则无论如何,下一个参数都将被视为参数。它可以以破折号开始,或者甚至与有效选项一致,它仍将被视为选项参数。

如果你的程序想要拒绝以破折号开头的参数,你需要自己编程。以破折号开头的密码完全合法;检查密码的程序不得拒绝它们。

接受可选参数的选项非常混乱且非标准。 Getopt一般不支持它们。有一个GNU扩展,但没有使用它。

TL; DR没有什么可以解决的,你的脚本很好。

答案 1 :(得分:0)

我还没有测试过您的脚本,但我认为如果您使用getopts代替boost::function,您将获得预期的结果,因为-a不是一个有效的选择。