Pattern: set -e + ((VAR++)) bash静默退出
发现日期: 2026-07-28 来源: startup-check.sh 长期存在但未被发现的bug 严重度: 🔴 高(导致所有带警告的检查被误判为失败)
触发条件
set -euo pipefail
WARNINGS=0
((WARNINGS++)) # 当WARNINGS=0时,后置递增返回0,((0))=exit 1 → set -e触发脚本退出
根因
bash的 ((expr)) 算术表达式:表达式结果为0时返回exit 1。配合 set -e,脚本立即终止。
修复
# ❌ 危险写法
((COUNT++))
# ✅ 安全写法
COUNT=$((COUNT + 1))
影响范围
startup-check.sh 中14处 ((ERRORS++)) 和 ((WARNINGS++))。导致:
- 任何警告都使脚本exit 1
- 摘要信息从未被打印
- smoke-test误判startup-check为FAIL(实际一切正常)
预防规则
- 所有bash脚本的
((...))递增必须用$((...))赋值形式 - 或在
((...))后加|| true - CI/CD中应检查bash脚本是否含
set -e+((...++))组合