if else - temperatur condition

  • Hai

    ich versuch mich grad an bash skripten.

    hier komm ich nicht weiter:


    es wird immer else ausgeführt. Die Variable $temp ist vorhanden und wird vorher sogar noch aufgelesen.
    conditions wie -gt -et -le werden gar nicht akzeptiert so das ich < und > umgestiegen bin.

    Kann mir jemand helfen, seh den wald von lauter Bäumen nicht. Es müsste eigentlich immer das erste Bild hochgeladen werden, also orange... landet aber immer beim else. temp ist momentan 26,4°C.

    danke und gruß

    Einmal editiert, zuletzt von 4zap (28. Februar 2016 um 21:32)

  • bash legt da zwar kein Wert drauf aber es trägt enorm zur Lesbarkeit bei: Einrückungen. Dadurch erkennt man eigentlich sofort zu welchem Abschnitt eine Zeile gehört.
    Auch ist "then" kein Teil des betroffenen Codes falls eine if Bedingung zutrifft, gehört also eigentlich in die selbe Zeile wie if: if [ 1 = 1 ]; then

    Scripts werden von oben nach unten abgearbeitet.
    In deinem Script wird nirgends die Variable temp befüllt, somit können nachfolgende Abfragen von $temp auch nicht greifen.

    Einfache " > " oder " < " werden als Umleitung gewertet.
    Entweder du musst das Zeichen escapen: \<
    Oder du musst stattdessen -lt für less-than, oder -gt für greater-than ; verwenden.

  • Hallo 4zap,

    mal abgesehen von den syntaktischen Problemen birgt Dein Code noch ein logisches.

    Du beabsichtigst zuerst auf > 26 zu prüfen.
    Falls diese Bedingung nicht erfüllt ist, prüfst Du im ersten elif auf < 25.
    Im nächsten elif aber auf > 28.
    Abgesehen davon, dass Deine Idee in BASH fehlerträchtig umgesetzt ist, wird es niemals zu einem positiven Ergebnis bei der Prüfung > 28 kommen. Denn dieser Fall ist bereits bei > 26 enthalten.

    Dass bei Deinem Skript immer der else-Teil abgearbeitet wird, sollte Dir ein Zeichen sein, dass der Rest vorher nicht einmal annähernd die Wirkung zeigte, wie Du sie beabsichtigtest.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Danke für die schnellen Antworten. Wie ihr ja sehr hab ich von Bash skripten kaum Plan.
    Erst les ich mit perl Temperatursensoren aus und lass mir im bash skript die mit rdd graph rendern und lad die dann mit curl auf meine Webseite.
    Da wird die Variable "temp" ja schon verwendet wird sollte die existieren.
    Vorher will ich im dem Skript prüfen ob folgende Bedingungen gegeben sind:
    temp größer als 27°C -> lad die orange grafik hoch
    temp. kleiner als 25°C -> lad mir die blaue Grafik hoch
    temp. größer als 28°C -> lad mir die rote Grafik hoch
    passt nix lad mir die grüne Grafik hoch.

    So dachte ich mir das zumindest. Mein Code ist ne Katastrophe, ist mir klar. Hier mal ein Beispiel aus meine Skript...

    Das Ganze ist eine Überwachung für mein AQ wenn ich außer Haus bin. Da ich keine Ports nach inhouse auf meinen Raspberry aufmachen will und auf die lokale Apache Webseite zuzugreifen hab ich mich für den Grafikimport auf den Public Webserver entschieden.
    Rechts in der Sidebar soll dann jeweils das grüne/gelbe/rote/blaue .gif erscheinen was jeweils nach der if else Abfrage hochgeladen wird und was mir sofort den Status mitteilt.
    Das ganze kann man sich hier anschauen:

    http://knipsfisch.de/aq-live-monitoring-temperature-graphs/

    viele Grüße
    Rainer

  • Entweder du musst das Zeichen escapen: \<
    Oder du musst stattdessen -lt für less-than, oder -gt für greater-than ; verwenden.

    ... oder Du benutzt

    Code
    if (( temp > 26 )); then
    ...
    fi

    Mit (( .. )) kann man alle arithmetischen Operationen ganz einfach in bash vornehmen. Benutze ich gerne. Auch muss man die Variablen nicht mit $ prefixen ;)

    Siehe dazu z.B. hier

  • Wieso so umständlich? Perl Script zum auslesen, Bash Script zum erstellen der Graph-Bilder und hochladen auf einen ftp :-/

    Um was für Sensoren handelt es sich denn?

    Wie wärs stattdessen mit FAQ --> Nützliche Links / Linksammlung --> Sensor Werte mit HighCharts visualisieren


    Davon ab, befüllst du wie gesagt nirgends die Variable " temp ". Wenn du dein bash Script ausführst müsste es auch eine Fehlermeldung geben so von wegen Du führst das perl Script aus, machst mit dessen Ausgabe aber nichts.

  • Code
    ./create_graph1.sh: 28: ./create_graph1.sh: temp: not found
    ./create_graph1.sh: 32: ./create_graph1.sh: cannot open 25: No such file
    ./create_graph1.sh: 32: ./create_graph1.sh: temp: not found
    ./create_graph1.sh: 36: ./create_graph1.sh: temp: not found


    erhalte ich als Ausgabe bei folgender syntax. nicht lachen bitte :blush:


    die condition wie mygrafd vorschlägt mit -le oder -gt habe ich versucht und wird als "unknown expression" quittiert.
    Sitz schon den ganzen Nachmittag dran und hab mich durch einige tuts gewühlt.... Wär schön wenn ihr mir helfen könntet.

    Ich hab ja die Vermutung das die Variable temp gar nicht da ist. rrd graph holt sich die aus der rrd DB in die ich die werte vorher reinschreibe. Im Perl Skript generiere ich die Variable temp indem ich die variable outputAQ aus dem sensorwert generiere und dann in die Variable $temp umrechne da die Sensoren Werte wie 25647 ausgeben. Das muss ich erst in 25,647 °C umwandeln.

    Das Schreiben und auslesen klappt fehlerfrei. Die letzte Zeile wird mir auch ausgegeben wenn ich das skript laufen lasse. $temp wird dort fehlerfrei dargestellt. Wenn ich z. Bps. im Bash Skript

    Code
    echo $temp

    ausgeben will kommt eine leere Ausgabe zurück. Ich glaub eher hier liegt der Fehler.


    Danke und Gruß

    Rainer

    Einmal editiert, zuletzt von 4zap (28. Februar 2016 um 23:07)

  • :thumbs1: Das ist ja auch mein Ziel. Ich hab diverse tuts gewälzt bis jetzt und bin schon ganz schon weit gekommen für meine Verhältnisse. Ich hab da keinen professionellen Anspruch dran, für mich ist das ein Hobby. Das mit fehlenden Variable war richtig. Ich hab das jetzt gelöst das ich zumindest eine gerundete Variable hab ich weiterverwenden kann. Ich les die aus der rrd aus, mit echo $temp erhalt ich jetzt auch den richtigen wert angezeigt. Ich war der meinung da die von rrd graph verwendet wird kann ich da auch drauf zugreifen. falsch gedacht.

    Code
    if [ $temp \> 27 ]
    
    
    then

    aber ich muss mit $temp arbeiten....

    ansonsten funktioniert das prinzip, hab alle szenarien durch probiert und bin happy! Geht! :thumbs1:
    Die Logik passt auch.

    Danke euch vielmals das ich nerven durfte. Hab wieder was gelernt und danke für die links :)

    Mir ist manchmal egal ob ich bash, perl und python mische. Gerade bei der Anforderung an einen AQ Computer ist mir das simpelste Mittel recht.

    viele Grüße

    rainer

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!