Floating Zahlen vergleichen

  • Hallo,
    möchte in einer Bash möglichst performant zwei floating Zahlen miteinander vergleichen und je nach Differenzwert verschiedene "Aktionen" steuern.

    Bsp:
    AktVerbrauch= 1.545 kWh
    LetzterVerbrach= 2.242 kWh

    Wenn der aktuelle Verbrauch mehr als 30% über dem letzten Verbrauch liegt: Color=RED
    Wenn der aktuelle Verbrauch mindestens 30% unter dem letzten Verbrauch liegt: COLOR=GREEN
    Wenn der aktuelle verbrauch sich "kaum" verändert hat: COLOR=schwarz

    Mit einem einfachen Befehl wie diesem:
    if [ $Aktverbrauch -ge `expr $LetzterVerbrauch * 1.3`]
    then
    COLOR=RED
    ....

    geht ja nicht weil floating ....

    Danke für Tipps, sollte ja in einen 6-Zeiler passen, oder?

    Einmal editiert, zuletzt von topsurfer (17. November 2014 um 18:26)

  • Gibt diverse Möglichkeiten (siehe z.B. hier ;) )

    Die weitverbreiteste ist die Benutzung von bc. Wenn viel gerechnet werden muss ist python der perl oder awk besser angeraten. Mit bc würde Dein Beispiel wie folgt aussehen:

    Code
    if (( $(echo "$Aktverbrauch >= $LetzterVerbrauch * 1.3" | bc) )); then
       COLOR=RED
    fi


    Achtung: Die Leerzeichen sind wichtig bei den Klammern.

  • Hallo,

    Solche Zahlen kannst du z.B so vergleichen:

    Ansonsten kann man dazu auch bc verwenden. Deine Auswertungen (Prozentual/kaum verändert) sind dann nur Mathematik.


  • Gibt diverse Möglichkeiten (siehe z.B. hier ;) )

    ... Mit bc würde Dein Beispiel wie folgt aussehen:

    Code
    if (( $("$Aktverbrauch >= $LetzterVerbrauch * 1.3" | bc) )); then
       COLOR=RED
    fi


    Achtung: Die Leerzeichen sind wichtig bei den Klammern.

    Habe das mal versucht, bekomem aber folgende "Fehler":
    ./menergy.sh: line 117: 0.912 >= 1.078 * 1.2: command not found
    ./menergy.sh: line 121: 1.078 >= 0.912 * 1.2: command not found

    Code sieht so aus, sollten die Klammern so sein wie sie genannt wurden:

    Code
    HtmlBorderColor="993300"
             if (( $("$KwhLive >= $LastKwhLive * 1.2" | bc) )); then
                HtmlBorderColor="FF0000"
             fi
    
    
             if (( $("$LastKwhLive >= $KwhLive * 1.2" | bc) )); then
                HtmlBorderColor="00FF00"
             fi

    Danke euch!!

  • Hallo,
    mir fällt jetzt nur eine Merkwürdigkeit auf.
    Starte ich das Script, in welchem ich diesen Vergleich ausführe aus der Shell heraus, funktioniert es. OK! Es erfolgt keinerlei Fehlermeldung, der Größenvergleich erfolgt korrekt!

    Starte ich es über das erstellte RC-Script, erhalte ich folgende Ausgaben:
    (das RC-Script selbst funktioniert, läuft, schreibt in Logfiles, erstellt Graphen, nur:)

    ...
    /root/menergy.sh: 126: /root/menergy.sh: 0: not found
    ...

    Und das ist diese Codezeile:

    Code
    if (( $(echo "$KwhLive >= $LastKwhLive * 1.2" | bc) )); then

    Fehlt da was im Environment? Muss im RC/Startscript noch etwas "mitgegegeben" werden?
    Die Variablen KwhLive und auch LastKwhLive sind auch beim starten über das RC-Script korrekt besetzt!

    Einmal editiert, zuletzt von topsurfer (19. November 2014 um 22:53)

  • Schreibe mal vod diese Zeile die folgenden zwei Befehle

    Code
    set -o verbose
    set -o xtrace

    und sieh Dir an wie genau die Befehlszeile zum Zeitpunkt des Fehlers aussieht. Darüber kann man wohl rausbekommen was der Grund ist.

  • *** Starting: menergy.sh
    No menergy running, creating actual graphics and starting menergy.sh ...
    + echo 1.252 >= 0 * 1.2
    + bc
    + 1
    /root/menergy.sh: 128: /root/menergy.sh: 1: not found
    + echo 0 >= 1.252 * 1.2
    + bc
    + 0
    /root/menergy.sh: 139: /root/menergy.sh: 0: not found
    + [ 0 -eq 1 ]


    Für mich sieht es so aus, als ob kein "if" gemacht wird (false/true), sonders dass das Ergebniss des Checks (0 oder 1) "ausgegegeben" wird ... und die Shell mit "1" und "0" nichts anfangen kann ...

  • Stimmt, so sehe ich es auch.

    Kann es sein dass irgendwie eine andere shell benutzt wird also nicht die bash?

    Probiere mal

    Code
    if [ $(echo "$KwhLive >= $LastKwhLive * 1.2" | bc) -eq 1 ]; then

Jetzt mitmachen!

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