[erledigt] Dezimalzahl zu Ganzzahl machen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
GregorS
Beiträge: 2629
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

[erledigt] Dezimalzahl zu Ganzzahl machen

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])

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Dezimalzahl zu Ganzzahl machen

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.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Dezimalzahl zu Ganzzahl machen

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!

Benutzeravatar
GregorS
Beiträge: 2629
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Dezimalzahl zu Ganzzahl machen

Beitrag von GregorS » 12.09.2023 17:49:36

Meillo hat geschrieben: ↑ zum Beitrag ↑
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: 579
Registriert: 19.04.2008 22:59:51

Re: Dezimalzahl zu Ganzzahl machen

Beitrag von katzenfan » 12.09.2023 18:01:33

Funzt das nicht übers einfache Auf- oder Abrunden? Da werden evtl. Kommastellen doch auch "weggenommen"?

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Dezimalzahl zu Ganzzahl machen

Beitrag von heisenberg » 12.09.2023 18:10:52

GregorS hat geschrieben: ↑ zum Beitrag ↑
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." ?
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
GregorS
Beiträge: 2629
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Dezimalzahl zu Ganzzahl machen

Beitrag von GregorS » 12.09.2023 18:13:39

heisenberg hat geschrieben: ↑ zum Beitrag ↑
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])

Benutzeravatar
Livingston
Beiträge: 1455
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Dezimalzahl zu Ganzzahl machen

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: 336
Registriert: 09.12.2016 04:15:59

Re: Dezimalzahl zu Ganzzahl machen

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):

Code: Alles auswählen

if [ ${NET_THROUGHPUT_5/\.*/} -gt 2000 ]; then

Benutzeravatar
GregorS
Beiträge: 2629
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Dezimalzahl zu Ganzzahl machen

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])

Antworten