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

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Jere, 30.09.2011.

  1. #1 Jere, 30.09.2011
    Zuletzt bearbeitet: 30.09.2011
    Jere

    Jere Grünschnabel

    Dabei seit:
    16.10.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo zusammen,

    ich habe ein Problem mit einem selbstgebauten Script.

    Edit 10:26: Pardon, es handelt sich um ein HP-UX Release B.11.23 U ia64.

    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 if-Test-Abfrage kontrolliert. Deshalb auch dieser Post - die Antworten, die ich zu dieser Fehlermeldung gefunden habe, referenzieren nur auf leere Variablen. In diesem Fall wird sie doch aber mitgegeben, wie mir das echo zeigt? Vielleicht trage ich auch die falsche Brille und fokussiere mich nicht genug? -->
    - Echos eingebaut (unmittelbar vor und nach 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, der ja bereits oben deklariert wurde).


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

    Code:
    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!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Psyjo

    Psyjo Routinier

    Dabei seit:
    15.11.2005
    Beiträge:
    259
    Zustimmungen:
    0
    Ort:
    Hinter'm Berg
    Versuchs mal mit
    Code:
    if [[ "${Wert1}" >= "${Wert2}" ]]
    ...
    
    also mit 2 eckigen Klammern, ggf auch mit

    Code:
    if [[ ${Wert1} -ge ${Wert2} ]]
    ...
    

    das '-ge' steht für 'greater or equal'.
     
  4. Jere

    Jere Grünschnabel

    Dabei seit:
    16.10.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo Psyjo und danke für die schnelle Rückmeldung!

    Die -ge kann ich leider nicht verwenden, weil der Wert zum vergleichen nicht integer ist (Load Average hat ja diesen blöden Punkt im Rückgabewert).
    Damit bin ich ganz am Anfang auf die Nase gefallen :-)

    Ich habe gemäß deinem Vorschlag um Klammern erweitert, so schaut die Zeile nun aus:

    Code:
    ...
     if [[ "$AVNOW" >= "$NOTIFY" ]];
    ...
    
    Die Shell mag aber die Syntax nicht, soweit ich weiß müssen bei doppelten Klammern andere test-conditions verwendet werden?

    Code:
    ./check_cpu_load.sh: line 26: syntax error in conditional expression
    ./check_cpu_load.sh: line 26: syntax error near `"$NOTIFY"'
    ./check_cpu_load.sh: line 26: ` if [[ "$AVNOW" >= "$NOTIFY" ]]; '
    
     
  5. Psyjo

    Psyjo Routinier

    Dabei seit:
    15.11.2005
    Beiträge:
    259
    Zustimmungen:
    0
    Ort:
    Hinter'm Berg
    OK, ich hatte angenommen das wäre eine Bash. Du könntest den '.' entfernen und dann numerisch prüfen - sofern das der Ausgangswert zulässt.
    >> sed 's/\.//'
     
  6. #5 bytepool, 30.09.2011
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    @Psyjo: Du hast uebersehen dass es um Dezimalzahlen geht.

    @TE: Du hast zwar die Shell nicht dazu geschrieben, aber ich nehme mal an dass es um die Bash geht. Die kann naemlich keine floating point arithmetic. Dafuer gibt's bc:
    Code:
    a=0.5;b=0.7
    
    lowerOrEqual=$(echo "$a <= $b" | bc)
    
    if [ 1 -eq "$lowerOrEqual" ]; then 
      echo do stuff; 
    fi
    
    MfG,
    bytepool
     
  7. #6 HeadCrash, 30.09.2011
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Mahlzeit,

    oder einfach direkt im awk

    Code:
    uptime | awk -F'load average: ' '{ split($2, load, ", "); if (load[1] >= 1) { print "load[1] alarm" } else { print "load[1] gaga" } }'
    
    mfg
    HeadCrash
     
  8. Jere

    Jere Grünschnabel

    Dabei seit:
    16.10.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Tut mir leid Euch nach den super guten Hinweisen weiterhin nerven zu müssen,
    aber ich habe noch meine Schwierigkeiten mit der Umsetzung :think:


    @bytepool, bc mag meine bash wohl überhaupt nicht in der Form:

    Code:
    abc - /home/xy- ! - (-bash)
    
    > : NOTIFY='1.00'
    > : FTEXT='load average: '
    > : AVNOW="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f1)"
    > : lowerOrEqual=$(echo "$AVNOW <= $NOTIFY" | bc) 
    [B]<-- Hätte ich hier 1 nehmen müssen? Oder 1.00? Jedenfalls den festen Schwellwert aus $NOTIFY ?[/B]
    > : if [ 1 -eq "$lowerOrEqual" ]; then echo "ja"; fi
    -bash: [: syntax error on line 1, : integer expression expected
    
    > : echo $lowerOrEqual
    syntax error on line 1,
    @HeadCrash, Deine Idee finde ich auch super!
    Das Ergebnis wird auch immer richtig ausgegeben, allerdings habe ich keine Vorstellung wie ich dort meine Kommandos platziere.
    Das print ist toll für die ersten Erfolgsgefühle auf meiner Shell, aber ich möchte ja meine top-Ausgabe weggeschrieben bekommen,
    sofern der Schwellwert erreicht ist. Sonst sehe ich nicht, welcher Prozess mich wiedermal unglücklich macht, sondern nur das dort erhöhte Last ist. Gibt es da eine Möglichkeit für?

    Besten Dank und viele Grüße
    Jere
     
  9. #8 HeadCrash, 30.09.2011
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Hi,

    gibt es:
    Code:
     system("top ... > logfile")
    
    Fast jede Programier-/ Skriptsprache kennt für sowas Funktionen in der Form von "system" oder "exec".
    Was auch geht, was ich persönlich aber unschön finde, per awk das auzuführende Kommando erzeugen und dann an die Shell pipen.

    mfg
    HeadCrash
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. #9 bytepool, 30.09.2011
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    bc ist ein externes Programm, und kein built-in. Teste doch einfach mal was 'echo "$AVNOW <= $NOTIFY" | bc' in der Konsole von sich gibt.

    Um welche Bash Version geht's denn genau? Wenn du eine zu alte Version laufen hast, kann es auch gut sein dass $() nicht erkannt wird, dann musst du stattdessen backticks `` benutzen.

    Oder direkt die Variante von HeadCrash komplett in awk.

    MfG,
    bytepool
     
  12. Jere

    Jere Grünschnabel

    Dabei seit:
    16.10.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo zusammen,

    zunächst: Jeden von Euch vielen Dank für die schnelle und konkrete Hilfe! :)

    Ich kann den Titel nicht mehr editieren, sonst hätte ich ein **Gelöst** davor gesetzt.
    Vielleicht kann das ja noch ein Moderator nachziehen...

    Irgendwann 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:

    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'
    FTEXT='load average: '
    AVNOW2="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f1 | sed 's/\.//')"
    NOTIFY2='170'
    
    
    #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 3
            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 an Euch!
    Jere
     
Thema:

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

Die Seite wird geladen...

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

  1. [Erledigt] Shell-Skript lässt sich nicht mit Cron ausführen

    [Erledigt] Shell-Skript lässt sich nicht mit Cron ausführen: Hallo, ich hoffe ihr könnt mir helfen. Ich entwerfe im Moment ein Skript, welches den Callmonitor (Telnet) auf meiner FritzBox abfragt und wenn...
  2. Shell-Skript Datum in einer Datai suchen

    Shell-Skript Datum in einer Datai suchen: Hallo zusammen Ich komm eigentlich aus der Klicki-Bunti-Welt von Windows. Seit geraumer Zeit versuche ich meine Künste mit verschiedenen...
  3. Shell Script Problem

    Shell Script Problem: Hallo zusammen, ich arbeite momentan mit einem Plagiat Tool, die ich über Git Bash ausführe. Es wird im Endeffekt ein Link generiert, die ich...
  4. Anonymisierungs-Distribution Tails 2.0 wechselt zu Gnome Shell

    Anonymisierungs-Distribution Tails 2.0 wechselt zu Gnome Shell: Tails (The Amnesic Incognito Live System) ist in Version 2.0 erschienen und bringt als Dektopoberfläche eine Gnome-Shell im Classic-Modus mit....
  5. Artikel: Shell Command Injection - Wie fremder Text in das Terminal gelangt

    Artikel: Shell Command Injection - Wie fremder Text in das Terminal gelangt: Man möchte sicher nicht, dass ein Fremder einen Befehl in das Terminal eingibt. Und doch kann es genau dazu kommen, wenn Skripte auf dem System...