当使用 `getopts` 和 `case` 时:`*)` 作为最后一个模式子句,或者 `\?)` 和 `:)` 作为最后两个模式子句?

当使用 `getopts` 和 `case` 时:`*)` 作为最后一个模式子句,或者 `\?)` 和 `:)` 作为最后两个模式子句?

使用getoptswithcase子句时,*)作为最后一个模式子句的模式子句是否相当于作为最后两个模式子句的\?)and模式子句的并集?:)具体来说,

while getopts "<optionString>" opt; do
    case $opt in
        a) a="$OPTARG"
           ;;
        b) b="$OPTARG"
           ;;

        ...
           ;;

        \?) printf "illegal option: -%s\n" "$OPTARG" >&2
            exit 1
            ;;
        :) printf "missing argument for -%s\n" "$OPTARG" >&2
           exit 1
           ;;
    esac
done

while getopts "<optionString>" opt; do
    case $opt in
        a) a="$OPTARG"
           ;;
        b) b="$OPTARG"
           ;;

        ...
           ;;

        *) printf "illegal option: -%s, or missing argument for -%s\n" "$OPTARG" "$OPTARG" >&2
            exit 1
            ;;
    esac
done

谢谢。

答案1

如果您使用静默错误报告(当 the 的第一个字符是冒号时),您只需要真正检查:?getoptsbashoptstring

getopts不以这种方式使用时,它将针对无效选项和缺少选项参数生成自己的诊断消息(这些通常已经足够了)。事实上,除非它被静音,否则它不会放置:?在​​变量中。

在 case 语句中使用*是捕获这两种情况的一种方法,但如果getopts被静音,您将不知道触发了哪个错误,而只能向an error occurred while parsing the command line options用户说一些话。

相关内容