Shell数值计算首选$(( )),因其语法简洁、功能完整、支持嵌套;expr仅用于POSIX兼容场景,需转义操作符;let为内置命令但易因引号缺失出错;三者均不支持浮点,需bc或awk补充。

Shell脚本中做数值计算,最常用的是 expr、let 和 $(( )) 三种方式。它们都能完成加减乘除等基本运算,但语法、兼容性和功能差异明显,选错容易报错或结果异常。
expr:传统 POSIX 兼容方式,但语法严格
expr 是最老的命令行工具,支持所有 POSIX shell(如 dash、ash),但要求操作符必须用空格隔开,且乘号 * 需转义。变量需用 $ 显式展开。
- 正确写法:
expr $a + $b、expr $a \* $b(*必须加反斜杠) - 错误写法:
expr $a+$b(缺少空格)、expr $a * $b(未转义,shell 会先通配展开) - 不支持浮点数,只返回整数;遇到非数字输入会报错或返回空
let:Bash/Ksh/Zsh 内置命令,支持复合赋值
let 是 Bash 等主流 shell 的内置命令,无需启动新进程,效率略高。它允许更接近 C 风格的表达式,支持 +=、++、-- 等操作,但不能直接输出结果,需配合 echo 或变量引用。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 基本用法:
let "sum = a + b"(引号可省略,但含空格或特殊字符时建议保留) - 简写形式:
let a+=2、let i++ - 注意:
let把表达式当字符串解析,若变量未定义,默认为 0;但若含非法字符(如未引号的$),会报错
$(( )):推荐首选,语法简洁、功能完整、支持嵌套
$(( )) 是 Bash、Zsh、Ksh 等现代 shell 的算术扩展语法,最直观、最安全。它自动展开变量,支持位运算、条件表达式、数组下标计算,还能嵌套其他命令替换。
- 基础运算:
result=$((a + b * 2)),括号内变量名可不带$ - 混合使用:
echo $(( $(date +%s) - start_time ))(嵌套命令替换) - 支持进制转换:
echo $((16#FF))输出 255,printf "%o\n" 63输出八进制 - 不支持浮点数,但可用
bc或awk补充,例如:echo "scale=2; $a / $b" | bc
实际使用建议
日常脚本开发优先用 $(( )),它可读性强、容错性好、功能丰富;仅在需要严格 POSIX 兼容(如写 /bin/sh 脚本且目标系统无 Bash)时才用 expr;let 可作为替代,但语法稍冗余,且易因引号缺失出错。所有方式都不处理小数——真要算浮点,老老实实用 bc 或 awk。

















