在匹配未知命令行选项方面,-?* 模式是否比 -* 提供任何优势?

问题描述 投票:0回答:1

http://mywiki.wooledge.org/BashFAQ/035 的“手动循环”部分,他们有此代码。

#!/bin/sh
# (POSIX shell syntax)

# Reset all variables that might be set
file=
verbose=0

while :; do
    case $1 in
        -h|-\?|--help)   # Call a "show_help" function to display a synopsis, then exit.
            show_help
            exit
            ;;
        -f|--file)       # Takes an option argument, ensuring it has been specified.
            if [ "$2" ]; then
                file=$2
                shift 2
                continue
            else
                echo 'ERROR: Must specify a non-empty "--file FILE" argument.' >&2
                exit 1
            fi
            ;;
        --file=?*)
            file=${1#*=} # Delete everything up to "=" and assign the remainder.
            ;;
        --file=)         # Handle the case of an empty --file=
            echo 'ERROR: Must specify a non-empty "--file FILE" argument.' >&2
            exit 1
            ;;
        -v|--verbose)
            verbose=$((verbose + 1)) # Each -v argument adds 1 to verbosity.
            ;;
        --)              # End of all options.
            shift
            break
            ;;
        -?*)
            printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
            ;;
        *)               # Default case: If no more options then break out of the loop.
            break
    esac

    shift
done

# Suppose --file is a required option. Check that it has been set.
if [ ! "$file" ]; then
    echo 'ERROR: option "--file FILE" not given. See --help.' >&2
    exit 1
fi

# Rest of the program here.
# If there are input files (for example) that follow the options, they
# will remain in the "$@" positional parameters.

我试图理解脚本中的这些台词。

    -?*)
        printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
        ;;

我一直在使用模式

-*
来匹配未知选项。但是这个脚本使用了匹配未知所需的模式
-?*

为什么

-?*
模式在匹配未知选项方面比
-*
模式更有优势?

shell switch-statement
1个回答
2
投票

有时使用单独的破折号来读取

stdin
-?*
不会明白这一点。

?
是 shell 通配符,用于匹配任何单个字符。
*
匹配零个或多个字符。因此
-?*
强制破折号后至少有一个字符。

© www.soinside.com 2019 - 2024. All rights reserved.