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からロード平均を取得し、これらのフィールドに基づいて位置パラメータを設定します。 2番目のフィールドをつかみ、ピリオドを削除します。値(現在の数字)が500以上の場合は警告を出します。これは、(現在の)負荷平均が小数点以下の2桁まで表示されることを前提としています。ありがとうより良い方法を指摘してください。

答え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

関連情報