Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
GregorS
- Beiträge: 3157
- Registriert: 05.06.2008 09:36:37
- Wohnort: Freiburg
-
Kontaktdaten:
Beitrag
von GregorS » 12.09.2023 17:38:13
Hallo zusammen!
In einem Shellscript möchte ich eine Dezimalzahl (z.B. 15.1) zu einer Ganzzahl machen, damit ich es in
Code: Alles auswählen
...
if [ $NET_THROUGHPUT_5 > 2000 ]; then
NET_THROUGHPUT_5=2000
fi
...
verarbeiten kann. Es sieht so aus, als wäre die Bedingung immer wahr. Für NET_THROUGHPUT_5=7.15 bekomme ich nämlich immer 2000 ausgeworfen.
Beim Ergebnis sind die Nachkommastellen egal, die könnten vor dem if gestrichen werden. Wichtig ist mir, dass das Ergebnis auf max. 2000 begrenzt wird.
Was tun?
TIA
Gregor
Zuletzt geändert von
GregorS am 12.09.2023 18:44:04, insgesamt 1-mal geändert.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
-
heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von heisenberg » 12.09.2023 17:42:14
Code: Alles auswählen
#!/bin/bash
LC_ALL=C NET_THROUGHPUT_5="$(printf "%.0f" $NET_THROUGHPUT_5)"
bzw.
Code: Alles auswählen
...
if [ $(LC_ALL=C printf "%.0f" $NET_THROUGHPUT_5) -gt 2000 ]; then
NET_THROUGHPUT_5=2000
fi
...
...und zusätzlich das, was Meillo schreibt.
Zuletzt geändert von
heisenberg am 12.09.2023 17:46:31, insgesamt 2-mal geändert.
-
Meillo
- Moderator
- Beiträge: 9241
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 12.09.2023 17:42:39
Du hast vergessen, dass test(1) (also die eckigen Klammern nach dem if) auf String-Basis arbeitet. Ein Gleichheitszeichen vergleicht also zwei Strings und nicht zwei Zahlwerte. Wenn du Zahlen vergleichen willst, dann musst du -eq, -lt & Co. verwenden. Siehe Manpage test(1).
Fliesskommazahlen kann die Shell aber auch auf diese Weise nicht. Dafuer muss man andere Konstrukte verwenden.
Use ed once in a while!
-
GregorS
- Beiträge: 3157
- Registriert: 05.06.2008 09:36:37
- Wohnort: Freiburg
-
Kontaktdaten:
Beitrag
von GregorS » 12.09.2023 17:49:36
Meillo hat geschrieben: 12.09.2023 17:42:39
Fliesskommazahlen kann die Shell aber auch auf diese Weise nicht. Dafuer muss man andere Konstrukte verwenden.
Wie gesagt, um den Nachkomma-Teil geht es mir gar nicht. Ich möchte nur erreichen, dass ein Wert von 2150.3 als 2000 geloggt wird. Kann ich das ohne „test“ erreichen?
Gruß
Gregor
PS: Bei
Code: Alles auswählen
if [ $NET_THROUGHPUT_5 -gt 2000 ]; then
NET_THROUGHPUT_5=2000
fi
Bekomme ich lediglich eine Fehlermeldung:
Code: Alles auswählen
... Zeile 33: [: 1.88: Ganzzahliger Ausdruck erwartet.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
-
katzenfan
- Beiträge: 645
- Registriert: 19.04.2008 22:59:51
Beitrag
von katzenfan » 12.09.2023 18:01:33
Funzt das nicht übers einfache Auf- oder Abrunden? Da werden evtl. Kommastellen doch auch "weggenommen"?
-
heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von heisenberg » 12.09.2023 18:10:52
GregorS hat geschrieben: 12.09.2023 17:49:36
PS: Bei
Code: Alles auswählen
if [ $NET_THROUGHPUT_5 -gt 2000 ]; then
NET_THROUGHPUT_5=2000
fi
Bekomme ich lediglich eine Fehlermeldung:
Code: Alles auswählen
... Zeile 33: [: 1.88: Ganzzahliger Ausdruck erwartet.
Du hast gelesen, dass ich auch einen Beitrag geschrieben habe und Meillo schrieb: "Fliesskommazahlen kann die Shell aber auch auf diese Weise nicht." ?
-
GregorS
- Beiträge: 3157
- Registriert: 05.06.2008 09:36:37
- Wohnort: Freiburg
-
Kontaktdaten:
Beitrag
von GregorS » 12.09.2023 18:13:39
heisenberg hat geschrieben: 12.09.2023 18:10:52
Du hast gelesen, dass ich auch einen Beitrag geschrieben habe?
Entschuldige, das war aus dem Blick gescrollt. Ich mache gerade mehrere Sachen gleichzeitig ...
Sobald ich meinen Balkon-Besuch beendet habe, probiere ich Deinen Vorschlag.
Gruß
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
-
Livingston
- Beiträge: 1816
- Registriert: 04.02.2007 22:52:25
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: 127.0.0.1
Beitrag
von Livingston » 12.09.2023 18:15:02
Code: Alles auswählen
if [ `cut -d'.' -f1 <<< $NET_THROUGHPUT_5` -gt 2000 ]; then
NET_THROUGHPUT_5=2000
fi
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams
-
rodney
- Beiträge: 375
- Registriert: 09.12.2016 04:15:59
Beitrag
von rodney » 12.09.2023 18:16:04
Wenn Nachkommastellen abschneiden fuer den Test reicht (Werte von 2000.000...1 bis 2000.99999... werden nicht auf 2000 gesetzt):
-
GregorS
- Beiträge: 3157
- Registriert: 05.06.2008 09:36:37
- Wohnort: Freiburg
-
Kontaktdaten:
Beitrag
von GregorS » 12.09.2023 18:43:48
Danke für Euren Input! Jetzt klappt's.
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])