shell不支持浮点运算,需借助bc或awk等外部工具:bc适合精确计算与条件判断,awk更擅格式化输出与单行计算;浮点比较不可用整数语法,须通过bc或awk实现。

Shell 本身不支持浮点运算,所有内置算术(如 $(( ))、let、expr)都只处理整数。想做加减乘除、开方、比较大小等浮点计算,必须借助外部工具。最常用、最可靠的是 bc 和 awk,两者各有适用场景。
用 bc 做精确浮点计算
bc 是 Linux 自带的任意精度计算器,适合需要控制小数位数、做条件判断或复杂数学表达式的场合。
- 基本用法:通过管道传入表达式,例如
echo "3.14 * 2.5" | bc - 控制精度:用
scale=n指定小数位数,比如echo "scale=3; 10/3" | bc输出3.333 - 变量参与计算:把 Shell 变量展开后送入
bc,如a=7.2; b=8; echo "$a > $b" | bc返回0(false) - 注意:
bc默认不显示整数位前的0(如.003),如需格式化,可配合printf或改用awk
用 awk 做简洁浮点计算与格式化输出
awk 更适合单行计算和带格式的输出,尤其在保留前导零、四舍五入、混合字符串时更自然。
- 直接计算:
echo | awk '{print 3.14 * 2.5}'或传参awk -v a=3.14 -v b=2.5 '{print a * b}' - 格式化小数:
echo "1 3" | awk '{printf "%.3f\n", $1/$2}'输出0.333 - 支持科学计数法、取整函数(
int()、sqrt()、log()等),无需额外设置精度 - 在脚本中嵌入方便,例如:
j=$(awk -v i="$i" 'BEGIN{printf "%.2f", i*0.2-2.5}')
其他可行但较少用的方式
虽然不主流,但在特定环境下可作为备选:
-
printf+ 整数缩放:把浮点数放大成整数运算再折回,例如printf "%.3f" $(echo "1000*2/3" | bc) | sed 's/$/e-3/' | bc—— 复杂且易出错,仅适合极简场景 -
dc:逆波兰式计算器,功能强但语法反直觉,日常脚本中几乎不用 - 调用 Python/Perl:一行搞定,如
python3 -c "print(3.14 * 2.5)",但依赖外部解释器,移植性差
浮点数比较要特别注意
不能用 [ $a -gt $b ](这是整数比较),必须转成数值逻辑:
- 用
bc:if [ $(echo "$a > $b" | bc) -eq 1 ]; then ... - 用
awk:if awk -v x="$a" -v y="$b" 'BEGIN{exit !(x > y)}'; then ... - 避免直接用
test或[ ]对浮点字符串比较,结果不可靠(比如按字典序比 "1.5" 和 "10.2")











