Bash脚本if语句中浮点数大小比较的简单实现方法
Bash中直接在if语句实现浮点数比较的方法
Bash 原生的test判断(即你代码里用的[ ]结构)仅支持整数比较,不识别十进制小数,不用大改现有遍历逻辑,两种极简写法可以直接把浮点数判断嵌在if条件里,不需要重构整个循环结构:
方法1:用bc命令(上手成本最低,和原生判断逻辑几乎一致)
bc是绝大多数Linux/Unix系统默认预装的计算工具,原生支持浮点数运算,比较表达式返回1代表条件成立、0代表不成立,直接套在(( ))里就能作为if的判断条件,你原有的代码只需要替换if那一行即可:
while read element1 element2 element3; do # element3小于0.049时进入then分支 if (( $(echo "$element3 < 0.049" | bc -l) )) then operation # 替换为小于阈值时要执行的操作 else operation # 替换为大于等于阈值时要执行的操作 fi done < /path/file.txt
- 比较直接用常规数学符号即可:小于
<、大于>、小于等于<=、大于等于>=、等于==,不需要额外记Shell专属的比较参数 - 记得加
-l参数,会自动加载数学库,避免小数精度丢失导致的判断错误
方法2:awk单行写法(零额外依赖,适合精简系统环境)
如果运行环境没有预装bc,也可以用单行awk做判断,同样不需要改动外层循环结构,直接替换if条件即可:
while read element1 element2 element3; do if awk -v val="$element3" 'BEGIN{exit !(val < 0.049)}' then operation else operation fi done < /path/file.txt
注意:把Shell变量传给awk的时候一定要用
-v参数传递,不要直接拼在awk语句里,避免特殊字符引发执行错误。
两种写法都不需要把整个遍历逻辑改成awk实现,和你原来的代码结构完全兼容,改造成本极低。
内容的提问来源于stack exchange,提问作者Giordano
相关产品推荐
相关产品推荐

