シェルスクリプトで浮動小数点値を比較するには?

シェルスクリプトで浮動小数点値を比較するには?

私の負荷平均が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逆の意味を持つために必要です。ファイルをawkの標準入力に<送信するために使用されます。/proc/loadavgawkを呼び出すと、-vmax_load=$MAX_LOAD awk変数がmax_loadシェル変数の値に設定されますMAX_LOAD

場合によっては、MAX_LOADが整数であり、ファイルから最初の浮動小数点を読み取るため、一時的な解決策は次のとおりです。

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

呼び出しはcutの最初の数字の整数部分を抽出します/proc/loadavg。しかし、上記の仮定のいずれかが間違っていることが判明した場合、アイデアは失敗します。

おすすめ記事