## [ERR-20260429-008] bash `set -e` + `((counter++))` 第一次自增触发退出

**日期**: 2026-04-29
**类别**: Bash 脚本陷阱

### 现象

写了个 sweep 脚本（`scripts/dev/sweep-stale-branches.sh`）：
```bash
set -eo pipefail
gone_count=0
while read -r line; do
  ((gone_count++))    # ← 看似无害
  echo "..."
done < <(...)
```

结果脚本第一次进入循环就静默退出，输出截断。

### 根因

`((expr))` 的退出码取决于 expr **求值后的结果**：非零=success（exit 0），零=fail（exit 1）。

`((gone_count++))` 是**后置自增**，返回**自增前**的值。当 `gone_count=0` 时，表达式求值为 0 → exit 1 → `set -e` 杀掉脚本。

只有从 1 开始或用前置 `++gone_count` 才不出问题，但前置在第一次也是 1（OK）后续都 OK——可读性反而差。

### 修法

```bash
gone_count=$((gone_count + 1))   # 赋值，不是表达式判定
```

或：

```bash
: $((gone_count++))   # `:` no-op 吞掉返回码
(( ++gone_count ))    # 前置：返回新值，永远 ≥ 1
```

### 预防

- `set -e` 下任何 `((expr))` 算术都要检查"结果可能为 0 吗"。计数器、布尔、位运算都中招。
- 推荐统一写 `var=$((var + 1))` 形式，等价但避坑。

---
