Bash脚本getopts参数异常求助:-e选项触发无效提示
解决Bash getopts中
-e触发无效选项的问题 看起来你遇到的问题根源是对getopts的选项字符串语法和错误处理逻辑理解有点偏差,咱们一步步拆解:
问题原因分析
- 选项字符串的冒号误用:
你写的选项字符串是":s:d:e:*",其中s:、d:、e:里的冒号表示这些选项必须跟随参数。但你执行./myscript.sh -e时没有传参数,getopts会把这种情况判定为错误,返回?作为opt的值。 - 错误的"通配符"处理:
Bash的getopts并不支持用*作为通配符来匹配未知选项,*在这里只是一个普通的选项字符(就像s/d/e一样)。而你的case语句里没有处理?这个错误标识,所以当getopts返回?时,就会匹配到最后的*)分支,输出错误提示。
至于为什么-ee能正常运行?因为这时候getopts会把第二个e当成-e选项的参数,满足了e:需要参数的要求,所以会正常执行kb_enable函数,不会触发错误分支。
修正后的代码
如果你的s、d、e选项都不需要参数,应该这样写:
while getopts ":sde" opt; do case $opt in s) kb_status ;; d) kb_disable ;; e) kb_enable ;; \?) echo "Invalid option: -$OPTARG" >&2 ;; :) echo "Option -$OPTARG requires an argument." >&2 ;; esac done
关键调整说明
- 去掉了选项字符串中
s/d/e后面的冒号:表示这些选项不需要参数 - 用
\?)分支处理未知选项:当用户输入未定义的选项时,会触发这个分支 - 用
:)分支处理选项缺少参数的情况(如果之后有需要参数的选项,这个分支就会派上用场) - 开头的
:作用是抑制getopts自带的错误提示,让我们可以自定义错误输出
这样修改后,执行./myscript.sh -e就会正常调用kb_enable,而输入无效选项(比如-x)才会触发错误提示。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

