So subtrahieren Sie Float-Werte in einem Shell-Skript

So subtrahieren Sie Float-Werte in einem Shell-Skript

Ich habe ein Skript, das Gleitkommawerte verwendet, aber irgendwie kann ich nicht zwei Gleitkommawerte subtrahieren.

Dies ist der Beispielcode

#!/bin/bash

p="1"
h="10"
m=$(echo "3.5"| bc -l)
for (( c=$p; c<=$h; c++ ))
do
   r=$(echo "($p-$m)"| bc -l)

   echo "Z $c $m $r"
done

und das ist das Ergebnis

Z 1 3.5 -2.5
Z 2 3.5 -2.5
Z 3 3.5 -2.5
Z 4 3.5 -2.5
Z 5 3.5 -2.5
Z 6 3.5 -2.5
Z 7 3.5 -2.5
Z 8 3.5 -2.5
Z 9 3.5 -2.5
Z 10 3.5 -2.5

Antwort1

Ändern Sie die Zeile

   r=$(echo "($p-$m)"| bc -l)

Zu

   r=$(echo "($c-$m)"| bc -l)

da dies nicht der Fall ist, $paber $cdies wird durch die Schleife geändert.

Antwort2

bashunterstützt keine Gleitkommaarithmetik. kshund zshtun. POSIXly, Sie könnten entweder bcalsFlorians Antwortschlägt vor, oder awk. Zum Beispiel,

$ awk 'BEGIN{print 2.5+3.7}'
6.2

Ubuntu verfügt außerdem über Pythonund Perl, die mehr als fähig sind, Gleitkommaberechnungen durchzuführen.

$ perl -le 'print(2.5+3.7)'
6.2

$ python3 -c 'print(2.5+3.7)'
6.2

Siehe auch eine sehr umfangreiche Liste anderer Optionen:Wie führt man Integer- und Float-Berechnungen in Bash oder anderen Sprachen/Frameworks durch?

Beachten Sie auch, dass gemäßPOSIX-Shell-Sprachstandardin arithmetischer Erweiterung $((...)):

Es ist nur die Arithmetik mit vorzeichenbehafteten langen Ganzzahlen erforderlich. Als Erweiterung erkennt die Shell möglicherweise auch arithmetische Ausdrücke, die über die aufgelisteten hinausgehen.

Das Weglassen der Gleitkommaarithmetik entspricht daher den POSIX-Spezifikationen bash./bin/dash

Antwort3

Ich weiß, das ist spät, aber da das Ergebnis bei Google erschienen ist, liest es vielleicht jemand. Die Lösung ist, es als „$a- $b“ zu schreiben. Mit dem Leerzeichen funktioniert es für mich.

verwandte Informationen