Linux - Zahlen-Runde in Shell
Ernst
- webserver
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
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.
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
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
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.
Super, genau das habe ich gesucht, jetzt brauche ich nur noch gerade Zahlen und das ganze klappt. :-)
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
Hallo Christoph,
if (( $ping > 500 or $ping <2 )); then
echo schlecht
else echo gut
fiAlso, "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
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.
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