我有以下代码:

while getopts ":vh" opt; do
        case $opt in
         (h)
                helpMe
                exit 0
         ;;
         (v)
                version1
                exit 0
         ;;
         \?)
                echo -e "Invalid option: -$OPTARG\ntype -h for more help.\n" >&2
                exit 1
        ;;
        esac
done

此代码应仅获取标志“h”和“v”。
但是当我给flag例如'hg'时,我仍然得到帮助输出。
另外,当我给标志“va”时,我仍然得到版本输出。
我想说的是,我的剧本是忽略所有字母后的一个要求。
为什么会这样?
有人能建议一下吗?
谢谢您。

最佳答案

循环一次分析和处理一个选项,-hg被视为两个单独的选项,-h-g。由于循环遇到-h首先触发了helpMe和退出,而没有解析“cc>”。如果使用-g运行脚本,您会看到它在点击-gh选项时失败,因为它在本例中是第一个。
如果您不喜欢这种行为,可以使用变量来存储状态,让-g完成解析,然后测试getopts

while getopts ":vh" opt; do
    case $opt in
        h)
            opt_h=true
            ;;
        [...]
    esac
done

if [ "${opt_h}" = true ]; then
    helpMe
    exit 0
fi

10-06 05:10