Bash脚本如何同时支持带值参数与无值布尔开关标志
问题根因
你出现报错是因为getopts的选项字符串规则用错了:
在getopts的第一个参数字符串中,字母后带冒号:代表该选项必须传入参数,不带冒号则代表该选项是无值的开关标志。你当前写的选项字符串是u:a:f:h:,h后面带了冒号,所以系统会强制要求-h参数必须传值,和你的需求冲突。
修复方案
只需要把getopts的选项字符串里h后面的冒号删掉即可,修改后的完整代码如下:
human=false # 仅修改了getopts后的选项字符串,删除h后面的冒号 while getopts u:a:f:h flag do case "${flag}" in u) username=${OPTARG};; a) age=${OPTARG};; f) fullname=${OPTARG};; h) human=true;; esac done if $human; then echo "Hello human" else echo "You're not human" fi echo "Username: $username"; echo "Age: $age"; echo "Full Name: $fullname";
测试验证
修改后运行测试命令bash test.sh -u asdf -h,输出如下,不会再报参数错误:
Hello human Username: asdf Age: Full Name:
可选扩展
如果你需要自己处理未知选项的报错、避免getopts自动输出错误信息,可以在选项字符串最开头加一个冒号,同时在case分支中新增未知选项的处理逻辑,示例如下:
while getopts :u:a:f:h flag do case "${flag}" in u) username=${OPTARG};; a) age=${OPTARG};; f) fullname=${OPTARG};; h) human=true;; \?) echo "未知选项: -$OPTARG" >&2; exit 1;; :) echo "选项 -$OPTARG 需要传入参数" >&2; exit 1;; esac done
内容的提问来源于stack exchange,提问作者lisa-thehexbit
相关产品推荐
相关产品推荐

