shell脚本
set -euo pipefail 完整解读
你脚本开头那行其实是三个保护开关的组合:
| 选项 | 作用 | 比喻 |
|---|---|---|
set -e |
命令失败立即退出 | 保险丝 |
set -u |
使用未定义变量时报错退出 | 拼写检查器 |
set -o pipefail |
管道中任一命令失败则整个管道失败 | 流水线质检 |
((count++)) 就是一个典型陷阱:
点击查看代码
count=0
((count++))
# bash 算术规则:表达式的值 = count 自增【之前】的值 = 0
# bash 规定:算术表达式值为 0 → 退出码 = 1(视为"假/失败")
# set -e 看到退出码 1 → 以为出错了 → 立刻终止脚本!💀
解决办法
点击查看代码
# 方法1:|| true(最常用,推荐)
((count++)) || true # 即使左边失败,true 永远返回0
# 方法2:用 let 代替
let count++ # let 不会因为值为0而返回失败
# 方法3:用 $(( )) 赋值
count=$((count + 1)) # 这是赋值语句,不是算术求值,不会返回失败
expr = Expression Evaluator(表达式求值器),在你的代码中就是用来计算两个变量之和的工具。如果是新写的脚本,建议直接用 $ ((a + b)) 替代。
| 写法 | 示例 | 说明 |
|---|---|---|
expr (旧) |
val=`expr $ a + $ b` |
外部命令,效率低,仅整数 |
$ (( )) (推荐) |
val= $ ((a + b)) |
Bash 内置算术扩展,效率高,仅整数 |
bc |
val= $ (echo " $ a + $ b" | bc) |
支持浮点数运算 |

浙公网安备 33010602011771号