在使用时的选项字符串中getopts
,来自http://wiki.bash-hackers.org/howto/getopts_tutorial
如果选项字符串的第一个字符是 :(冒号),这通常是无意义的,因为它前面没有选项字母,getopts 会切换到“静默错误报告模式”。在生产脚本中,这通常是您想要的,因为它允许您自己处理错误而不会被烦人的消息打扰。
我想知道以下是什么意思:
“静默错误报告模式”
“它允许您自己处理错误而不会被烦人的消息打扰”?
你能举一些例子吗?
如果第一个字符optstring
是冒号,getopts
则不会为缺少选项参数或无效选项生成任何诊断消息。
如果您确实需要更多地控制脚本生成的诊断消息,或者如果用户提供了奇怪的命令行选项,您根本不希望在标准错误流中出现任何内容,这可能很有用。
在静默报告模式下(带有初始:
),如果您想提醒用户无效选项,则必须?
在传递给 的变量中查找getopts
。同样,对于缺少的选项参数,它是一个:
. 这是通常由getopts
自己处理的两个错误,但是要向用户报告自己的错误,您需要分别捕获它们才能给出正确的诊断消息。
在非静默报告模式下,getopts
对标准错误进行自己的错误报告,您只需要捕获*
“任何错误”。
比较这两个例子:
#!/bin/bash
while getopts 'a:b:' opt; do
case "$opt" in
a) printf 'Got a: "%s"\n' "$OPTARG" ;;
b) printf 'Got b: "%s"\n' "$OPTARG" ;;
*) echo 'some kind of error' >&2
exit 1
esac
done
Run Code Online (Sandbox Code Playgroud)
该*
案例捕获任何类型的命令行解析错误。
$ bash script.sh -a
script.sh: option requires an argument -- a
some kind of error
$ bash script.sh -c
script.sh: illegal option -- c
some kind of error
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
while getopts ':a:b:' opt; do
case "$opt" in
a) printf 'Got a: "%s"\n' "$OPTARG" ;;
b) printf 'Got b: "%s"\n' "$OPTARG" ;;
:) echo 'missing argument!' >&2
exit 1 ;;
\?) echo 'invalid option!' >&2
exit 1
esac
done
Run Code Online (Sandbox Code Playgroud)
:
上面的case 捕获缺少参数错误,而?
case 捕获无效选项错误(请注意,?
需要转义或引用以匹配文字?
,否则它会匹配任何单个字符)。
$ bash script.sh -a
missing argument!
$ bash script.sh -b
missing argument!
$ bash script.sh -c
invalid option!
Run Code Online (Sandbox Code Playgroud)