jere
Goto Top

Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

./check_cpu_load.sh: line 26: [: 0.94: unary operator expected

Hallo zusammen,

ich habe ein Problem mit einem selbstgebauten Script.

Was es machen soll:
- Schreibt den aktuellen Load Average in $LOGFILE
- Prüft, ob der ausgelesene Wert (z.B. 2.44) gleich oder größer ist als $NOTIFY (1.00)
- Wenn das wahr ist, dann schreibt er in $LOGFILE2 das Ergebnis vom top-Kommando
- Wiederholt, bis ich in der Shell manuell abbreche. Das ganze stellt nur ein temporäres "Überwachen" dar.

Was es tatsächlich tut:
Alles, außer die Prüfung $AVNOW >= $NOTIFY und damit das schreiben des top-Kommandos sofern die CPU ausgelastet wird.

Nur in das $LOGFILE schreibt er brav wie geplant mit den entsprechenden ausgelesenen Werten:
Thu Sep 29 14:40:26 METDST 2011 Aktueller Wert: 1.07
Thu Sep 29 14:40:29 METDST 2011 Aktueller Wert: 1.07
Thu Sep 29 14:40:32 METDST 2011 Aktueller Wert: 1.04
[...]

Fehlermeldung auf der Shell:
./check_cpu_load.sh: line 26: [: 0.91: unary operator expected
(Die Zahl ändert sich natürlich, die Meldung als solches bleibt bei jedem Aufruf gleich)

Was habe ich bereits gemacht:
- Den Test in der if von "-ge" auf ">=" gesetzt, weil ich nicht mit integer arbeiten kann.
- Die Abfragewerte in Häkchen gesetzt, Leerzeichen in der Test-Abfrage kontrolliert.
- Echos eingebaut (unmittelbar vor dem if ein "echo "$AVNOW $NOTIFY"", so das mir der Wert aus AVNOW und NOTIFY ausgegeben wird.
Ergebnis: n.nn (der jeweils aktuelle Wert in richtiger Form) und 1.00).


Hier meine relevanten Codezeilen, ein paar Sachen habe ich weggelassen wie z.B. die LOGFILE Deklarationen:

NOTIFY='1.00'  
FTEXT='load average: '  

while [ 1 ]
do
        sleep 3
        AVNOW="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f1)"  
        echo "`date` Aktueller Wert: $AVNOW" >> $LOGFILE  
        if [ "$AVNOW" >= "$NOTIFY" ];  
                        then
                                top -w -s 1 -d 10 -n 15 >> $LOGFILE2
                fi
done

Wieso taucht es auf, und was kann ich dagegen unternehmen?
Vielen Dank!

Content-ID: 173934

Url: https://administrator.de/contentid/173934

Ausgedruckt am: 26.11.2024 um 04:11 Uhr

bloodstix
bloodstix 30.09.2011 um 17:01:08 Uhr
Goto Top
Zitat von @Jere:
Hallo zusammen,

ich habe ein Problem mit einem selbstgebauten Script.

Was es machen soll:
- Schreibt den aktuellen Load Average in $LOGFILE
- Prüft, ob der ausgelesene Wert (z.B. 2.44) gleich oder größer ist als $NOTIFY (1.00)
- Wenn das wahr ist, dann schreibt er in $LOGFILE2 das Ergebnis vom top-Kommando
- Wiederholt, bis ich in der Shell manuell abbreche. Das ganze stellt nur ein temporäres "Überwachen" dar.

Was es tatsächlich tut:
Alles, außer die Prüfung $AVNOW >= $NOTIFY und damit das schreiben des top-Kommandos sofern die CPU ausgelastet
wird.

Nur in das $LOGFILE schreibt er brav wie geplant mit den entsprechenden ausgelesenen Werten:
Thu Sep 29 14:40:26 METDST 2011 Aktueller Wert: 1.07
Thu Sep 29 14:40:29 METDST 2011 Aktueller Wert: 1.07
Thu Sep 29 14:40:32 METDST 2011 Aktueller Wert: 1.04
[...]

Fehlermeldung auf der Shell:
./check_cpu_load.sh: line 26: [: 0.91: unary operator expected
(Die Zahl ändert sich natürlich, die Meldung als solches bleibt bei jedem Aufruf gleich)

Was habe ich bereits gemacht:
- Den Test in der if von "-ge" auf ">=" gesetzt, weil ich nicht mit integer arbeiten kann.
- Die Abfragewerte in Häkchen gesetzt, Leerzeichen in der Test-Abfrage kontrolliert.
- Echos eingebaut (unmittelbar vor dem if ein "echo "$AVNOW $NOTIFY"", so das mir der Wert aus AVNOW und
NOTIFY ausgegeben wird.
Ergebnis: n.nn (der jeweils aktuelle Wert in richtiger Form) und 1.00).


Hier meine relevanten Codezeilen, ein paar Sachen habe ich weggelassen wie z.B. die LOGFILE Deklarationen:

> NOTIFY='1.00'  
> FTEXT='load average: '  
> 
> while [ 1 ]
> do
>         sleep 3
>         AVNOW="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f1)"  
>         echo "`date` Aktueller Wert: $AVNOW" >> $LOGFILE  
>         if [ "$AVNOW" >= "$NOTIFY" ];  
>                         then
>                                 top -w -s 1 -d 10 -n 15 >> $LOGFILE2
>                 fi
> done
> 

Wieso taucht es auf, und was kann ich dagegen unternehmen?
Vielen Dank!


Ganz einfach, weil 0.91 als String zählt und der nicht als Zahl verglichen werden kann.
if [ "$AVNOW" >= "$NOTIFY" ];



Was du machen kannst ist

if [ `expr $AVNOW \>= $NOTIFY` ]; then
Jere
Jere 04.10.2011 um 14:25:22 Uhr
Goto Top
Danke für den Tipp, zwischenzeitlich hat das Suchen und rumfummeln nach einer Lösung den Nutzen überstiegen,
so dass ich es quick und böse dirty gemacht habe. Es erfüllt aber seinen Zweck und lässt sich zudem noch komfortabel auswerten.

Für später hier der aktuelle Code:

#!/bin/bash

DATUM=`/bin/date +%Y%m%d-%H%M%S`
LOGFILE=/home/xy/cpu_load/cpu_load_$DATUM.log
LOGFILE2=/home/xy/cpu_load/maxav_alarm_$DATUM.log
LOGFILE3=/home/xy/cpu_load/cpu_stat_$DATUM.csv
NOTIFY='1.70'  
NOTIFY2='170'  
FTEXT='load average: '  
AVNOW2="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f1 | sed 's/\.//')"  


#Script und CPU Infos ausgeben
date >> $LOGFILE
echo "$0 wird aufgerufen auf `uname -n` von User `whoami`." >> $LOGFILE  
echo " " >> $LOGFILE  
echo "Zeigt Informationen zur CPU Nutzung" >> $LOGFILE  
echo " " >> $LOGFILE  
echo "-------------------------------------------------------------- " >> $LOGFILE  
echo " " >> $LOGFILE  

while [ 1 ]
   do
        sleep 30
        AVNOW="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f1)"  
        echo "`date` Aktueller Wert: $AVNOW" >> $LOGFILE  
        echo "`date +%H:%M:%S`;$AVNOW;$NOTIFY" >> $LOGFILE3  
        echo "`date +%H:%M:%S`;$AVNOW;$NOTIFY"  
   if [ "$AVNOW2" -ge "$NOTIFY2" ];  
      then
	echo "$AVNOW ; $NOTIFY" >> $LOGFILE2  
	top -w -s 1 -d 1 -n 20 >> $LOGFILE2
	echo " " >> $LOGFILE2  
   fi
done


Nochmals vielen Dank!
Jere