it-swarm.com.de

Unärer Operator erwartet

#!/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 Was könnte der Grund sein

6

Das Problem

Das Problem ist, dass CPU_USAGE als leere Zeichenfolge endet. Dies verursacht hier ein Problem:

[ $CPU_USAGE -gt 85 ] 

Nachdem die Shell-Variable ausgewertet wurde, wird Folgendes angezeigt:

[ -gt 85 ] 

Dies schlägt fehl, weil das Argument vor dem -gt jetzt fehlt.

Die Lösung

Um einen nicht leeren CPU_USAGE zu erhalten, müssen wir ersetzen:

CPU_USAGE=$(top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1)

mit:

CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)

wo ein % hinzugefügt wurde.

Zitieren

Wie oben erwähnt, wird, wenn CPU_USAGE leer und nicht in Anführungszeichen gesetzt ist, der Fehler "Unärer Operator" ausgegeben:

$ CPU_USAGE=""; [ $CPU_USAGE -gt 85 ] && echo yes
bash: [: -gt: unary operator expected

In solchen Situationen empfiehlt es sich, Shell-Variablen in Anführungszeichen zu setzen. Wenn wir es zitieren, erhalten wir eine andere Fehlermeldung:

$ CPU_USAGE=""; [ "$CPU_USAGE" -gt 85 ] && echo yes
bash: [: : integer expression expected

Solange noch ein Fehler auftritt, ist diese Fehlermeldung zumindest informativer: Sie besagt, dass $CPU_USAGE keine Zahl ist.

Vereinfachung

Der Prozess cut wird nicht benötigt. Wir können ersetzen:

CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)

mit:

CPU_USAGE=$(top -b -n1 | awk -F'[ .]+' '/^%Cpu/ {print $2}')
7
John1024

Ihre Linie

top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1

ist falsch. Zunächst bitten Sie AWK, eine Zeile zu finden, die mit Cpu beginnt, obwohl sie tatsächlich mit %Cpu beginnt.

Zweitens benötigen Sie den Teil cut nicht. Sie können awk direkt verwenden:

$ top -b -n1 | awk '/^%Cpu/ {gsub(/\./," ");print $2}'                                             
31

Für die Zukunft können Sie Skripts mit set -x am oberen Rand des Skripts nach #!/bin/bash Zeile debuggen. Verwenden Sie auch https://www.shellcheck.net/ , um die Syntax eines Shell-Skripts zu überprüfen

4