Ernst: Linux - Zahlen-Runde in Shell

Hallo,

Ich weiss gehört nicht ganz hier her, aber vielleicht kann mir trotzdem jemand helfen.

Ich habe mir ein Shell Script geschrieben welches mir offtmals folgende Werte ausgibt

0.005
0.6
5.00386

Nun würde ich diese Zahlen gerne aufrunden damit ich sie wie folgt weiterverwenden kann.

if (( 17 < 20 )); then
   echo "17 ist kleiner als 20"
else
   echo "hier stimmt irgendetwas nicht..."
fi

Leider unterstützt diese IF Anweisung nur ganze zahlen, daher mein Problem. Gruss

  1. hallo,

    Ich weiss gehört nicht ganz hier her

    Wieso nicht? Shellscripting paßt durchaus zum Forum, hat bloß kein eigenes Topic.

    Ich habe mir ein Shell Script geschrieben welches mir offtmals folgende Werte ausgibt
    0.005
    0.6
    5.00386

    Da würde ich gerne wissen, was du da abfragst.

    Nun würde ich diese Zahlen gerne aufrunden damit ich sie wie folgt weiterverwenden kann.
    if (( 17 < 20 )); then
       echo "17 ist kleiner als 20"
    else
       echo "hier stimmt irgendetwas nicht..."
    fi
    Leider unterstützt diese IF Anweisung nur ganze zahlen

    Weil du es so vorgegeben hast. Du kannst aber bei Shellscripting genauso wie in anderen Scriptbereichen Variablen verwenden. Pack die Ausgabe deines Scripts in eine Variable und prüfe dann, ob die Variable kleiner als 20 ist. Ich würde es jedenfalls erstmal so probieren.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hallo

      Danke für die Antwort.

      Wie folgt komme ich auf die Werte,

      ping=$(ping -c 1 beispiel.de | grep 62-2-97-245 | awk '{print $8}' | sed -e 's/time=//')

      Nun ich weiss, ziemlich komischer Code, aber schöner kann ich es zurzeit nicht lösen.

      if (( $ping > 500 )); then
      echo schlecht
      else echo gut
      fi

      Wenn ich die Variable nun direkt in der IF Anweisung Verwernde, erscheint das hier,

      ping: line 3: ((: 28.1 > 500 : syntax error in expression (error token is ".1 > 500 ")

      Übrigens mein Ziel ist eigentlich nur, den Ping einer Website abzufragen, und abzuklären ob er höher als 500 ms ist, oder der Server gar nicht mehr erreichbar ist.

      :-) Anfänger

      1. Habe direkt noch eine Frage,

        if (( $ping > 500 )); then
        echo schlecht
        else echo gut
        fi

        Kann ich die IF Anwendung irgendwie so umstellen das ich zweimal einen Wert abfragen kann

        if (( $ping > 500 or $ping <2 )); then
        echo schlecht
        else echo gut
        fi

        Danke

        1. hallo,

          Kann ich die IF Anwendung irgendwie so umstellen das ich zweimal einen Wert abfragen kann
          if (( $ping > 500 or $ping <2 )); then
          echo schlecht
          else echo gut
          fi

          Also, "zweimal abfragen" geht schon, aber nicht in dieser Weise. if kannst du mehrfach einsetzen, also sollte es schematisch so funktionieren:
          if [$ping > 500]; then
           echo schlecht
          elif [$ping <2]; then
           echo schlecht
          else echo gut
          fi
          Das ist jetzt kein geprüfter Code, aber was ich meine, sollte klar werden.

          Grüße aus Berlin

          Christoph S.

          --
          Visitenkarte
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
          1. Super, genau das habe ich gesucht, jetzt brauche ich nur noch gerade Zahlen und das ganze klappt. :-)

            1. Hallo Ernst,

              Super, genau das habe ich gesucht, jetzt brauche ich nur noch gerade Zahlen und das ganze klappt. :-)

              nein, hast Du nicht wirklich. Gerade Zahlen: Nutze den Modulo-Operator %.
              Beispiel für Shell-Arithmetik:

                
              declare -i a=15   # Deklariere die Variable a als Integer  
                                # und initialisiere sie mit dem Wert 15  
              b=$[$a % 2]       # Weise das Ergebnis von $a modulo 2 der Variablen b zu  
              echo $b           # 1 wird ausgegeben  
                
              if (( $a % 2 == 0 )); then          # oder gleich als Bedingung  
                  echo "$a ist gerade"  
              else  
                  echo "$a ist ungerade"  
              fi  
              
              

              info bash bietet eine Fülle von Informationen (wenn die Info-Seiten installiert sind).

              Freundliche Grüße

              Vinzenz

          2. Hallo Christoph,

            if (( $ping > 500 or $ping <2 )); then
            echo schlecht
            else echo gut
            fi

            Also, "zweimal abfragen" geht schon, aber nicht in dieser Weise.

            Im Prinzip schon, nur der Operator war falsch: || statt or.

            Das ist jetzt kein geprüfter Code, aber was ich meine, sollte klar werden.

            Das was Du hier vorschlägst, ist extrem umständlich. Du hast den OP vom
            rechten Pfad gebracht :-(

            bash kennt sowohl logische als auch bitweise-Verknüpfungsoperatoren.
            Bitte informiere Dich in den Infoseiten zu bash (die bei Debian leider nicht
            installiert werden).

            Freundliche Grüße

            Vinzenz

            1. hallo Vinzenz,

              Also, "zweimal abfragen" geht schon, aber nicht in dieser Weise.
              Im Prinzip schon, nur der Operator war falsch: || statt or.

              Deswegen habe ich auch auf die entsprechende Seite in SELFLINUX verlinkt, auf der man (zeimlich weit unten) lesen kann:

              Befehl1 || Befehl2 OR, entweder Befehl1 ausführen oder Befehl2 (Wenn Befehl1 nicht erfolgreich war)

              Das was Du hier vorschlägst, ist extrem umständlich

              Sehe ich nicht so. Außerdem ging es nur ums Prinzip. Mit "elif" ergibt sich lediglich ein etwas höherer Tippaufwand, andrerseits lohnt sich "elif" eigentlich erst dann, wenn es sich wirklich um eine deutlich "andere" Bedingung (beispielsweise, ob es grade draußen regnet) handelt.

              Bitte informiere Dich in den Infoseiten zu bash (die bei Debian leider nicht
              installiert werden).

              Man kann sie sich nachinstallieren. Die bash ist sicher die gebräuchlichste Shell, aber keineswegs die einzige.

              Grüße aus Berlin

              Christoph S.

              --
              Visitenkarte
              ss:| zu:) ls:& fo:) va:) sh:| rl:|
        2. Hallo Ernst,

          if (( $ping > 500 )); then

          eigentlich hast Du hier eher eine Bedingung als einen arithmetischen Ausdruck

          if (( $ping > 500 or $ping <2 )); then
          echo schlecht
          else echo gut
          fi

          Dennoch kannst Du selbstverständlich

            
          if (( $ping > 500  ||  $ping < 2 )); then  
              echo "schlecht"  
          else  
              echo "gut"  
          fi  
          
          

          schreiben.

          Bitte beachte, dass Shell-Arithmetik in bash mit Integern erfolgt, d.h. die
          Variable $ping sollte eine Integer enthalten.

          Freundliche Grüße

          Vinzenz