浮点数不能直接用 [ ] 或 (( )) 比较,因Shell原生不支持浮点运算;应使用bc命令,如result=$(echo "$a > $b" | bc),再判断[ "$result" -eq 1 ]。

浮点数不能直接用 [ ] 或 (( )) 比较
Shell 原生不支持浮点运算。像 if [ 3.14 -gt 2.71 ] 或 if (( 3.14 > 2.71 )) 这类写法会报错,因为 [ ] 只认整数,(( )) 会把小数点当语法错误。
用 bc 做可靠的小数比较
bc 是 Linux 自带的精度计算器,支持小数比较,返回 1(真)或 0(假):
- 先用
echo "a > b" | bc得到结果(如 1 或 0) - 再在 if 中判断该结果是否为 1
- 示例:
a=3.14159
b=2.71828
result=$(echo "$a > $b" | bc)
if [ "$result" -eq 1 ]; then
echo "$a 大于 $b"
elif [ "$(echo "$a echo "$a 小于 $b"
else
echo "$a 等于 $b"
fi
用 awk 一行完成三路判断
awk 内置浮点支持,语法更紧凑,适合嵌入式逻辑:
- 直接传变量进去:
awk -v a="$a" -v b="$b" 'BEGIN{if(a>b) print a " 大于 " b; else if(a<b print a b else></b> - 不用捕获中间结果,也不依赖外部命令返回值
- 对空值或非法输入有一定容错性(比如非数字会转成 0)
注意精度与相等判断的陷阱
浮点计算存在二进制表示误差,比如 0.1 + 0.2 在 shell 中可能不严格等于 0.3:
- 避免用
==直接判断相等 - 改用差值绝对值小于阈值(如 1e-6):用
bc计算scale=10; if((a-b) < 0.000001 && (a-b) > -0.000001) ... - 或在
awk中写:if (sqrt((a-b)^2) < 1e-6)


















