Bash - 使用具有多个参数的getopts

时间:2014-04-10 09:20:57

标签: linux bash shell getopts

我有以下代码:

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'只要。 但是当我举起国旗时,例如' hg'我仍然得到帮助输出。 当我给旗帜" va"我仍然得到版本输出。 我想说的是我的脚本在所需的字母之后忽略了所有字母。

为什么会这样? 有人可以建议吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

循环解析和处理选项,-hg被视为两个单独的选项,-h-g。由于循环首先遇到-h,它会触发helpMe并退出而不会解析-g。如果您使用-gh运行脚本,您会看到它在遇到-g选项时失败,因为在这种情况下它首先出现。

如果您不喜欢这种行为,可以使用变量来存储状态,让getopts完成解析并在之后测试-h

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

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

答案 1 :(得分:0)

在您的两个选择中都是exit的来电。 getopts将一次处理一个参数,这样当它h -h -g中的-hghelpMe的扩展)时,它会运行-g然后退出。

这意味着它永远不会在选项中找到-h

处理此问题的最简单方法是简单地说明,在flag_v=0 flag_h=0 while getopts ":vh" opt; do case $opt in (h) flag_h=1 ;; (v) flag_v=1 ;; \?) echo -e "Invalid option: -$OPTARG\ntype -h for more help.\n" >&2 exit 1 ;; esac done if [[ $flag_h -eq 1 ]] ; then helpMe exit 0 fi if [[ $flag_v -eq 1 ]] ; then showVersion exit 0 fi # Now continue, neither h nor v was specified. 上,它将输出帮助文本并退出,无论其他参数是什么。

如果您想确保参数有效,只需将它们的状态存储在选项检查代码中,然后再处理它们。

这样,检查将在任何操作之前完成。像这样:

-h

如果您指定-hv-v版本信息,则会提供帮助并退出,如果您指定{{1}}则退出,如果您提供任何其他选项,则退出并显示错误。< / p>

如果您指定 no 选项,它将继续执行注释以执行您的脚本要执行的操作。