如果未提供任何选项,则让 getopts 显示帮助

Posted

技术标签:

【中文标题】如果未提供任何选项,则让 getopts 显示帮助【英文标题】:Having getopts to show help if no options provided 【发布时间】:2014-12-22 21:45:15 【问题描述】:

我解析了这里发布的一些类似问题,但它们不适合我。

我有一个很棒的 bash 脚本,它有一些很酷的功能,下面是代码的相关部分:

while getopts ":hhelpf:d:c:" ARGS;
do
    case $ARGS in
        h|help )
            help_message >&2
            exit 1
            ;;
        f )
            F_FLAG=1
            LISTEXPORT=$OPTARG
            ;;
        d )
            D_FLAG=1
            OUTPUT=$OPTARG
            ;;
        c )
            CLUSTER=$OPTARG
            ;;
        \? )
            echo ""
            echo "Unimplemented option: -$OPTARG" >&2
            echo ""
            exit 1
            ;;
        : )
            echo ""
            echo "Option -$OPTARG needs an argument." >&2
            echo ""
            exit 1
            ;;
        * )
            help_message >&2
            exit 1
            ;;
    esac
done

现在,如果触发,我的所有选项都可以正常工作。我想要的是 getopts 在没有触发任何选项时吐出 help_message 函数,比如说脚本只是在 ./scriptname.sh 没有参数的情况下启动的。

我看到这里发布了一些方法,实现了 IF 循环和 函数 但是,由于我刚开始使用 bash 并且我已经在此脚本上有了一些 IF 循环,我想知道是否有更简单(且漂亮)的方法。

【问题讨论】:

我不认为 help 中的 getopts 字符串正在做你期望它做的事情。 getopts不做长选项。这应该是为该调用添加elp 的选项。 help 工作正常。 确定对此有信心吗?你在测试什么才能看到?在h|help case 块中粘贴echo case h,在* case 中粘贴echo 'case *',然后尝试script --help(然后script -l),看看你会得到什么。还有script --help(这将是长选项版本)。 我看到你在说什么,但我只是做了它并且它有效。我可以通过 -h 或 -help 调用脚本,它可以工作。 这些都不是我告诉你要测试的。做我实际上告诉你的事情来测试,看看你从那些添加的echo 行中得到什么输出。你不会得到你期望的案例。 【参考方案1】:

如果您只想检测不带任何选项调用的脚本,那么只需检查脚本中$# 的值,并在其为零时退出并显示消息。

如果你想捕捉没有传递选项参数(但非选项参数)仍然传递的情况,那么你应该能够在 getopts 循环之后检查 OPTIND 的值并在它是时退出1(表示第一个参数是非选项参数)。

【讨论】:

【参考方案2】:

非常感谢 Etan Reisner,我最终采纳了您的建议:

if [ $# -eq 0 ];
then
    help_message
    exit 0
else
...... remainder of script

这完全符合我的设想。 谢谢。

【讨论】:

【参考方案3】:

从@Etan Reisner 的声明中删除示例代码:

如果你想捕捉没有传递选项参数(但非选项参数)仍然传递的情况,那么你应该能够在 getopts 循环之后检查 OPTIND 的值并在它为 1 时退出(表明第一个参数是非选项参数)。

# Check if any arguments were passed
if [ $OPTIND -eq 1 ]; then
    help_message
    exit 1
fi 
# ........ the rest of the script

以防万一有人想要一个示例视觉 ?

【讨论】:

以上是关于如果未提供任何选项,则让 getopts 显示帮助的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 标准付款选项未显示在管理员中

处理用户输入与显示数据------------(更高级的getopts命令标准化选项)

shell 脚本参数解析之 getopt getopts

使用getopt命令解析shell脚本的命令行选项

使用 getopts 处理长短命令行选项

在 Bash 中使用 getopts 检索单个选项的多个参数