#!/bin/bash
SUBJECT="WARNING CPU USAGE HIGH"
TO=gmail id
MESSAGE=/tmp/messages
echo "#######################" > $MESSAGE
echo "CPU statistics as follows.." >> $MESSAGE
mpstat >> $MESSAGE
echo "#######################" >> $MESSAGE
CPU_USAGE=$(top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1)
[ $CPU_USAGE -gt 85 ] && mail -s "$SUBJECT" "$TO" < $MESSAGE`
./cpu.sh: line 11: [: -gt: unary operator expected
理由は何ですか
問題は、CPU_USAGE
が最終的に空の文字列になることです。これにより、ここで問題が発生します。
[ $CPU_USAGE -gt 85 ]
Shell変数が評価された後、上記は次のようになります。
[ -gt 85 ]
-gt
の前の引数がなくなったため、これは失敗します。
空でないCPU_USAGE
を取得するには、次のものを置き換える必要があります。
CPU_USAGE=$(top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1)
で:
CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)
%
が追加されました。
上記のように、CPU_USAGE
が空で引用符で囲まれていない場合、「単項演算子」エラーが発生します。
$ CPU_USAGE=""; [ $CPU_USAGE -gt 85 ] && echo yes
bash: [: -gt: unary operator expected
このような状況では、シェル変数を引用することをお勧めします。引用すると、別のエラーメッセージが表示されます。
$ CPU_USAGE=""; [ "$CPU_USAGE" -gt 85 ] && echo yes
bash: [: : integer expression expected
まだエラーが表示されますが、このエラーメッセージは少なくともより多くの情報を提供します。$CPU_USAGE
は数字ではないということです。
cut
プロセスは必要ありません。交換できます:
CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)
で:
CPU_USAGE=$(top -b -n1 | awk -F'[ .]+' '/^%Cpu/ {print $2}')
あなたのライン
top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1
間違っています。まず、AWKにCpu
で始まる行を検索するように要求していますが、実際には%Cpu
で始まります。
第二に、cut
部分は必要ありません。 awk
を直接使用できます。
$ top -b -n1 | awk '/^%Cpu/ {gsub(/\./," ");print $2}'
31
将来的には、set -x
行の後のスクリプトの先頭で#!/bin/bash
を使用してスクリプトをデバッグできます。また、シェルスクリプトの構文をチェックする https://www.shellcheck.net/ を使用します