linux 使用带多个参数的getopt

x33g5p2x  于 2022-12-11  发布在  Linux
关注(0)|答案(2)|浏览(125)

下面的代码:

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'时,我仍然得到版本输出。
我想说的是,我的脚本应该忽略所需字母后面的所有字母。
为什么会这样?有人能给点建议吗?

v64noz0r

v64noz0r1#

循环一次解析和处理一个选项,-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
vpfxa7rd

vpfxa7rd2#

getopts将处理参数 * 一次一个 *,因此,当它遇到-h -g中的h-hg的扩展)时,它将运行helpMe,然后退出。
这意味着它永远不会在选项中找到-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,则会提供版本信息并退出;如果提供任何其他选项,则会返回错误并退出。
如果您指定 no 选项,它只会在注解之外执行脚本要执行的任何操作。

相关问题