在 bash 脚本中比较小数点整数时出错

在 bash 脚本中比较小数点整数时出错

我正在尝试构建一个脚本,以在平均负载达到特定阈值时触发 Linux 设备的操作/警报。

脚本如下所示:

!/bin/bash

load=`echo $(cat /proc/loadavg | awk '{print $2}')`
if [ "$load" -gt 5 ]; then
        echo "foo alert!"
fi

echo "System Load $(cat /proc/loadavg)"

归功于helloacm.com让我从这里开始。

当我运行它时,我收到一个错误:

./foocheck.sh: line 4: [: 0.03: integer expression expected

这是有道理的——它看到了句点/小数并认为我正在将字符串与整数进行比较。

我为此找到的大多数解决方案都涉及bc -l该设备上不可用的解决方案。我需要找到一种方法来比较这些值而不使用bc.有任何想法吗?

答案1

只能使用整数部分进行比较:

load=$(awk '{print $2}' /proc/loadavg | cut -d. -f1)

答案2

由于您有 awk 可用并且 awk 可以处理浮点值,请执行以下操作:

awk '($1>5){print("yes")}'

编辑后的脚本:

#!/bin/bash

load=`echo $(cat /proc/loadavg | awk '{print $2}')`
loadtest=$(echo "$load" | awk '($1>5){print("yes")}')
if [ "$loadtest" = yes ]; then
    echo "foo alert!"
fi

当然,仅使用 awk 可以进一步简化整个脚本。

或许:

#!/bin/bash
awk '($2>5){print("foo alert!")}' /proc/loadavg

答案3

set -- $(cat /proc/loadavg)
load=${2/./}
if [ "$load" -ge 500 ]; then
  echo alert
fi

从 /proc 获取负载平均值,并根据这些字段设置位置参数。抓住第二个字段并去掉句点。如果该值(现在是数字)大于或等于 500,则发出警报。这假设(当前)负载平均值显示为小数点后两位。谢谢指出更好的方法。

答案4

bash不能做浮点。使用zsh,ksh93yash代替:

#! /bin/zsh -
read ignore load ignore < /proc/loadavg || exit
if ((load > 5)); then
  echo >&2 Alert
fi

或者因为您已经在使用awk(以及一些不必要的命令):

#! /bin/sh -
awk '$2 > 5 {print "Alert"}' < /proc/loadavg >&2

或者,如果您在sh if构造中需要它:

#! /bin/sh -
if awk '{exit !($2 > 5)}' < /proc/loadavg; then
  echo >&2 Alert
fi

相关内容