脚本支持 -e env 和 -d days,运维传了 -D 7,getopts 没有报错,days 保持默认 1,清理范围比预期少了 6 天。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,optstring 前面没有加冒号,getopts 对未知选项只打印一行 usage 就继续;变量赋值又在 case 外面,默认值悄悄生效。

「getopts 参数解析」这类改动最怕改一半,回滚脚本先准备好,再动生产。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

while getopts ":e:d:" opt; do
  case $opt in
    e) ENV=$OPTARG ;; d) DAYS=$OPTARG ;;
    *) echo "usage: $0 -e env -d days"; exit 2 ;;
  esac
done

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,optstring 写成 :e:d: 让未知参数返回问号;在问号分支里打印用法并 exit 2;参数值做非空和格式校验;用错误参数跑一次 确认退出码是 2。

最后用这个标准收尾,传 -D 7 时脚本打印用法并退出 2,不会按默认值继续跑。

作者 9823189