首页 > 解决方案 > 具有不同位数的 Bash 浮点比较错误

问题描述

好的,所以我一直在处理 speedtest-cli 的一些结果,并意识到由于 bash 似乎无法正确处理数字的变化,我遇到了一些错误?

无论如何,这是一个直接从终端运行的示例:

ubuntu:~$ l1=9.99
ubuntu:~$ l2=10.44
ubuntu:~$ if [[ (($l2 > $l1)) ]]; then echo "Ok"; fi
ubuntu:~$ if [[ (($l2 < $l1)) ]]; then echo "Not ok"; fi
Not ok

当然,比较例如。10.33 和 11.34 会给出正确的结果。

这是怎么发生的,我该如何解决?还有其他方法可以实现这种比较吗?

谢谢

标签: bashscripting

解决方案


您使用的是字符串比较,而不是数字。在双方括号内,括号仅用于优先级,因此您的条件相当于

[[ $l2 < $l1 ]]

要使用数字比较,请使用不带方括号的双括号:

(( l2 < l1 ))

不幸的是,这也不起作用,因为 bash 不支持浮点运算,只支持整数。

您需要使用外部工具,例如

bc <<< "$l1 < $l2"

bc返回1真和0假。


推荐阅读