在选项字符串中使用时getopts
,来自http://wiki.bash-hackers.org/howto/getopts_tutorial
如果选项字符串的第一个字符是 : (冒号),这通常是无意义的,因为它前面没有选项字母,getopts 会切换到“静默错误报告模式”。在高效的脚本中,这通常是您想要的,因为它允许您自己处理错误,而不会被烦人的消息打扰。
我想知道以下内容是什么意思:
“静默错误报告模式”
“它允许您自己处理错误,而不会被烦人的消息打扰”?
您能否举一些例子?
答案1
如果 的第一个字符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
案件*
抓获任何一种命令行解析错误。
$ 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
#!/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
上面的case:
捕获缺少参数错误,而?
case 捕获无效选项错误(请注意,?
需要转义或引用以匹配文字?
,否则它会匹配任何单个字符)。
$ bash script.sh -a
missing argument!
$ bash script.sh -b
missing argument!
$ bash script.sh -c
invalid option!
答案2
非静默,getopts
打印错误消息:
$ bash -c 'getopts a opt' getopts_test -b
getopts_test: illegal option -- b
静默,getopts
不自行打印:
$ bash -c 'getopts :a opt' getopts_test -b
$
因此,使用用于静默模式的冒号,我们可以按照我们喜欢的方式在脚本中打印我们自己的错误,而不是固定消息:
#!/bin/bash
while getopts :a opt; do
[[ $opt = "?" ]] && echo "Invalid option character '$OPTARG'" >&2;
done