GNU/Linux >> Linux の 問題 >  >> Linux

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

かなり奇妙な問題が発生しています。複数のサーバーでスクリプト(Bash)を実行しているのですが、いずれかのサーバーで動作しなくなりました(他のすべてのサーバーでは完全に正常に動作します)。

スクリプトの問題部分は次のとおりです:(私は自分で書いたわけではありません。すべてのクレジットは「リッチ」に送られます)(http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios-および-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

さらに詳しい情報が必要な場合はお知らせください。できるだけ早く提供できるよう努めます。

すべての入力に感謝します🙂

承認された回答:

あなたが提供したリンクから、私は以下の行を見る。

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

@Graemeのコメントに従って、上の行を下に変更してください。

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

ここで、上記の行を追加した後、resultの出力を変更する必要があります 以下のように整数に変換します。

result1=${result/.*}

エラーが発生したマシンの1つでは、この出力は整数ではないと思います。結果の出力を整数に変換するだけで、このような場合に対処できます。 resultを計算した後、以下の行を追加します 。

result1=${result/.*}

そして、resultの代わりに 変数名をresult1として変更します if内 ループし、エラーは発生しません。

cut -c -2だと思います これは主に、最初の2文字のみをカットしているため、エラーに起因します。結果に1文字しかない場合はどうなりますか?結果が1.23456であると仮定します 、上記のカットは1. resultの値として これが明らかにinteger expectedの原因です エラー。

残りのサーバーで正常に動作している理由は、resultのケースが発生していないためです。 変数は1桁です。結果が1桁の変数(上記の例で述べたようなもの)の場合、残りのサーバーでも失敗する可能性が高くなります。

関連:システム管理者(root)としてコマンドを実行する方法は?
Linux
  1. Bashスクリプトをデバッグする方法は?

  2. タイプセット-aスクリプトにエラーがありますか?

  3. テンプレートを記入するためのBashスクリプト?

  1. Bash スクリプト - Hello World の例

  2. 6 Bash 条件式の例 ( -e, -eq, -z, !=, [, [[ ..)

  3. 代替 --config Java bash スクリプト

  1. bashスクリプトにスペースを含むベース名?

  2. bash スクリプトをデーモンとして実行する

  3. Bash スクリプトでエラーを発生させる