如何在 shell 脚本中比较浮点值?

如何在 shell 脚本中比较浮点值?

如果我的平均负载超过 10,我需要发出警报。

如果我的 awk 命令返回一个整数,我可以这样做:

declare -i MAX_LOAD=10

declare -i L1=`cat /proc/loadavg | awk {'print $1'}`

if [ $L1 -gt $MAX_LOAD ]
then
    echo "Alert"
fi

但它返回 L1 中的浮点值(例如 2.35)。

我如何比较这种情况下的值?

答案1

由于您已经在使用 awk,也许最简单的方法是也在该语言中进行浮点比较:

MAX_LOAD=10.0
if ! </proc/loadavg awk -vmax_load=$MAX_LOAD '{ exit $1 > max_load }'
then
    echo Alert
fi

请注意,其中存在一些诡计:!操作员反转测试。这是必需的,因为 awk 中的布尔表达式和构造接收值的状态代码if具有相反的含义。用于<将文件定向/proc/loadavg 到 awk 的标准输入中。调用 awk with-vmax_load=$MAX_LOAD 将 awk 变量设置max_load为 shell 变量的值 MAX_LOAD

在您的特定情况下,由于您的 MAX_LOAD 是一个整数,并且由于您正在从文件中读取第一个浮点数,因此临时解决方案将是:

if [ $(</proc/loadavg cut -f1 -d.) -gt $MAX_LOAD ] ...

调用cut将提取 中第一个数字的整数部分/proc/loadavg。然而,如果上述任何假设成为错误,这个想法就会失败。

相关内容