Bashスクリプトエラー:整数式が必要です。

Bashスクリプトエラー:整数式が必要です。

やや奇妙な問題が発生しました。複数のサーバーでスクリプト(Bash)を実行していますが、そのうちの1つで動作が停止しました(他のすべてのサーバーでは正常に動作しています)。

スクリプトで問題となる部分は次のとおりです。 (私が直接書いたわけではなく、すべてのクレジットは「リッチ」に移動します。)(http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios-and-nrpe/)

    if [ "$result" -lt "$warn_level" ]; then     #Line 56
    echo "Memory OK. $result% used."
    exit 0;
elif [ "$result" -ge "$warn_level" ] && [ "$result" -le "$critical_level" ]; then  #Line 59
    echo "Memory WARNING. $result% used."
    exit 1;
elif [ "$result" -gt "$critical_level" ]; then   #Line 62
    echo "Memory CRITICAL. $result% used."
    exit 2;
fi

完全なエラーメッセージ:

./check_memory.sh: Line 56: [: 7.: integer expression expected

./check_memory.sh: Line 59: [: 7.: integer expression expected

./check_memory.sh: Line 62: [: 7.: integer expression expected

より多くの情報が必要な場合は、お知らせください。できるだけ早くご提供いたします。

すべてのコメントをお寄せいただきありがとうございます:)

ベストアンサー1

見かけ上のresult変数.の後に数字があるため、bashは認識できません。次の手順でエラーを再現できます。

[ 7. -gt 1 ]

質問にさらにスクリプトを追加すると、このコンテンツがどこから来るのかを提案できます。

修正する

スクリプト全体を見ると、次の行を置き換えました。

result=$(echo "$used / $total * 100" |bc -l|cut -c -2)

そして:

result=$(( 100 * used / total ))

usedtotalは整数なので整数bash算術が行われますが、乗算のシフトは最初から100です。または、正しい丸めを保証したい場合(計算の「整数除算」は常に効果的に丸められます):

result=$( printf '%.0f' $(echo "$used / $total * 100" | bc -l) )

これにより、末尾の点がないことを確認できますresult。使用された方法はcut10〜99の範囲の結果でのみ機能するため、良い考えではありません。resultあなたの場合のように、0-9と99以上の数字は失敗します。

アップデート2

~から@Stephaneのコメントは次のとおりです、しきい値と比較するときは丸めするのが最善です。これを念頭に置いて、質問のコードスニペットに別の小さなバグがあります。とで使用されているwarn_level比較間の不一致に注意してくださいcritical_level。比較はwarn_level正確ですが(ただ小さい)代わりに(小さいか等しい)をcritical_level使用してください。以下より少し大きい場合を考えてください。丸める必要がありますが、重要な警告は発生しません(比較が使用されている場合に発生します)。-le-ltresultcritical_levelcritical_level-lt

大きな問題ではないかもしれませんが、修正されたコードは次のとおりです。

if [ "$result" -lt "$warn_level" ]; then
  echo "Memory OK. $result% used."
  exit 0;
elif [ "$result" -lt "$critical_level" ]; then
  echo "Memory WARNING. $result% used."
  exit 1;
else
  echo "Memory CRITICAL. $result% used."
  exit 2;
fi

これらのテストは到着時に暗黙的-geに発生し、重複して削除されました。elifelse

おすすめ記事