shell整数运算用$((...))最可靠,支持四则、位运算和条件判断;浮点需bc或awk;所有输入须先校验再计算。

Shell本身不支持浮点运算,整数计算也需注意语法细节——直接用$((...))最可靠,避免误用$[...](已废弃)或expr(易出错)。
用$((...))做整数四则与位运算
这是现代Bash推荐的算术扩展语法,支持加减乘除、取模、幂运算和位操作,变量名可省略$前缀:
-
a=10; b=3; echo $((a + b))→ 输出13 -
echo $((a % b))→ 取模得1;echo $((a ** 2))→ 平方得100 -
if (( a > b )); then echo "ok"; fi—— 条件判断中也可直接用((...)),返回退出状态
避免常见陷阱:空值、负数与进制
算术上下文中未定义变量默认为0,但空字符串或含空格会导致报错;负数和不同进制数需显式标注:
-
x=""; echo $((x + 1))会报错,应先校验:[[ -z "$x" ]] && x=0 -
echo $((-5 * 2))正确;但echo $(( -5 * 2 ))(空格分隔)在旧版本可能失败 - 十六进制写
0xFF,八进制写0755,二进制写2#1010,如echo $((0xFF + 2#1010))
需要浮点?交给bc或awk
Bash原生不支持小数,简单场景用bc最轻量,注意指定小数位和输入进制:
-
echo "scale=2; 10 / 3" | bc→3.33(scale控制精度) -
echo "3.14 * 2^2" | bc -l→ 启用数学库后支持^和函数 - 批量计算用
awk更灵活:echo "1.5 2.5" | awk '{print $1 + $2}'
脚本中封装可复用的计算函数
把重复逻辑抽象成函数,提升可读性与健壮性:
- 整数校验+计算:
safe_add() { [[ "$1" =~ ^-?[0-9]+$ ]] && [[ "$2" =~ ^-?[0-9]+$ ]] && echo $(($1 + $2)); } - 带单位的磁盘使用率计算:
disk_pct() { local used=$(df . | tail -1 | awk '{print $3}'); local total=$(df . | tail -1 | awk '{print $2}'); echo "scale=1; $used * 100 / $total" | bc; } - 时间差转秒:
time_diff_sec() { date -d "$1" +%s 2>/dev/null; } # 配合$(())做减法
不复杂但容易忽略。关键就三点:整数用$((...)),浮点靠bc或awk,所有输入先校验再计算。











