使用getopts,如果未提供选项,则显示帮助信息

8

我查看了一些类似的问题,但它们对我来说不太合适。

我有一个很棒的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 function ,比如只使用 ./scriptname.sh 启动脚本而没有参数。
我看到这里有一些方法,实现 IF 循环和函数,但是,由于我刚开始学习bash,并且在此脚本中已经有一些IF循环,我想知道是否有更简单(并且漂亮)的方法来解决这个问题。

1
我认为在那个 getopts 字符串中的 help 并没有做你期望它做的事情。getopts 不支持长选项。应该将选项 elp 添加到该调用中。 - Etan Reisner
那个 help 正常工作。 - Omar
你确定吗?你测试了什么?在 h|help 案例块中插入一个 echo case h,在 * 案例中插入一个 echo 'case *',然后尝试使用 script --help(然后是 script -l),看看会得到什么。同时也可以使用长选项 script --help - Etan Reisner
我看到你所说的,但我刚刚尝试了一下,它可以工作。我可以调用脚本并传递-h或-help参数,它可以正常工作。 - Omar
那两个都不是我告诉你要测试的。执行我实际告诉你要测试的内容,看看你从那些加入echo行得到什么输出。你将得到意料之外的结果。 - Etan Reisner
3个回答

13

如果您只想检测脚本是否被调用而没有任何选项,则可以在脚本中检查$#的值,当值为零时退出并显示一条消息。

如果您想捕获未传递选项参数(但仍传递了非选项参数)的情况,则应该能够在getopts循环后检查OPTIND的值,并在其等于1时退出(表示第一个参数是非选项参数)。


6
感谢Etan Reisner,我最终采用了你的建议:
if [ $# -eq 0 ];
then
    help_message
    exit 0
else
...... remainder of script

这正是我所期望的方式运作。 谢谢。


0
从@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

以防万一,如果有人想要一个样例视觉


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接