Schnellzugriffe
- Warum Bash nur Ganzzahlen unterstützt
- bc interaktiv verwenden
- Die Standard-Mathematikbibliothek
- Eingabe an bc über die Befehlszeile senden
- bc in Bash-Shell-Skripten verwenden
- Alles ergibt einen Sinn
Wichtige Erkenntnisse
- Die Linux-Bash-Shell unterstützt nur Ganzzahlarithmetik und kann keine Berechnungen mit Gleitkommazahlen durchführen.
- Das Dienstprogramm bc in Linux ermöglicht präzise Gleitkommaberechnungen interaktiv und in Shell-Skripten.
- Mit bc können Sie die Anzahl der anzuzeigenden Dezimalstellen festlegen und Berechnungen mit beliebiger Genauigkeit durchführen, einschließlich der Verwendung von Funktionen aus der Standardmathematikbibliothek.
Die Linux-Bash-Shell unterstützt nur Ganzzahlarithmetik. Sie kann weder Gleitkommaberechnungen verstehen noch verarbeiten. Das Dienstprogramm bc ermöglicht Ihnen präzise Gleitkommaberechnungen interaktiv und in Shell-Skripten.
Warum Bash nur Ganzzahlen unterstützt
Die ursprüngliche Designentscheidung, die UnixBourne-Shell auf Ganzzahlarithmetik zu beschränken, könnte in der frühen Computertechnik begründet sein, bei der eine Ganzzahl einem einzelnen Byte RAM zugeordnet wurde. Wir werden vielleicht nie erfahren, was wirklich hinter dieser Entscheidung steckte. Und warum die Linux-Version der Bourne-Shell, die Bash-Shell, sich ebenfalls dafür entschied, diesem Beispiel zu folgen.
Bash kann selbst keine Berechnungen mit Gleitkommazahlen durchführen, und Berechnungen mit Ganzzahlen, die einen Bruchteil der Antwort hätten, werden als gekürzte Ganzzahlwerte ausgegeben. Dies gilt für die Befehlszeile und für Bash-Shell-Skripte. Je nach Anwendungsfall kann dies problematisch oder bahnbrechend sein.
Linux verfügt über zwei Dienstprogramme, mit denen Sie Gleitkommaberechnungen durchführen können. Eines davon ist dc. Es ist ein wenig kurios, da es in umgekehrter polnischer Notation arbeitet. Das andere Tool ist bc. Es kann interaktiv oder als Befehl verwendet werden und ist die Lösung, die wir hier besprechen werden.
Verwandte Themen: 9 Bash-Skriptbeispiele
Das Problem
Lassen Sie uns Bash dazu bringen, sechs durch drei zu teilen.
echo $((6/3))
Wir erhalten unsere erwartete Antwort von zwei. Lassen Sie uns nun sechs durch sieben teilen. Das Ergebnis ist eindeutig ein Bruch.
echo $((6/7))
Null ist offensichtlich falsch. Versuchen wir es noch einmal und teilen 16 durch 7.
echo $((16/7))
Wir erhalten eine Antwort von zwei. Was passiert, ist, dass der Bruchteil der Antwort verworfen wird, sodass die Antwort abgeschnitten wird. Im ersten Beispiel gab es keinen Bruchteil, also erhalten wir die richtige Antwort.
Das zweite Beispiel hatte kein ganzzahliges Element in der Antwort, nur einen Bruchteil. Da der Bruchteil verworfen wurde, ist die angezeigte Antwort Null.
Im dritten Beispiel ist 7 zweimal durch 16 teilbar, mit einem Bruchrest. Auch hier wird der Rest verworfen und das Ergebnis abgeschnitten.
bc interaktiv verwenden
Sie können bc als interaktiven Rechner verwenden, indem Sie bc eingeben und die Eingabetaste drücken.
bc
Die Anwendung bc wird gestartet, gibt ihre Versionsnummer bekannt und wartet dann auf Ihre Eingabe. Wenn Sie eine Berechnung eingeben und die Eingabetaste drücken, wertet bc die Berechnung aus und zeigt die Antwort an.
16 * 4
1024/32
2^2 * 1024
Sie können „Strg+L“ verwenden, um den Bildschirm zu löschen, und „Strg+D“, um das Programm zu beenden. Versuchen wir eine Berechnung, deren Antwort eine Bruchkomponente enthält.
22/7
Das haben wir nicht erwartet. Obwohl bc uns erlaubt, beliebige Genauigkeiten zu verwenden, zeigt es standardmäßig weder das Komma noch die darauf folgenden Zahlen an.
Um die wahre Antwort sichtbar zu machen, müssen wir bc mitteilen, wie viele Dezimalstellen angezeigt werden sollen. Dies tun wir mit dem Befehl „scale“. Wir fragen nach sieben Dezimalstellen und wiederholen unsere Berechnung.
scale=7
22/7
Endlich kommen wir voran. Die Einstellung „Skala“ bleibt bestehen, bis Sie sie ändern. Durch Festlegen der Anzahl der Dezimalstellen wird bc die maximale Anzahl der anzuzeigenden Stellen mitgeteilt. Wenn eine Antwort nicht so viele Dezimalstellen benötigt, wird sie mit der erforderlichen Anzahl an Dezimalstellen angezeigt und nicht mehr. Sie wird nicht mit bedeutungslosen Nullen aufgefüllt.
Skala = 10
0,300003 * 0,5
Sie können verschiedene Berechnungen in derselben Zeile auflisten, indem Sie sie durch ein Semikolon „;“ trennen. Die Antworten werden wie üblich zeilenweise in der Reihenfolge angezeigt, in der die Berechnungen aufgelistet wurden.
25 * 6; 12,5 + 45,001; 3 + 5 + 7 + 9
Sie können den Befehl „scale“ ebenfalls in die Liste aufnehmen.
scale=8; 22/7; scale=3; 0,3 * 0,071
Die Standard-Mathematikbibliothek
Die Option -l (Standard-Mathematikbibliothek) bewirkt, dass bc einen Satz von Funktionen lädt und „scale“ auf 20 Dezimalstellen setzt.
bc -l
22/7
Wenn die Standardbibliothek geladen ist, können Sie diese Funktionen in Ihren Berechnungen verwenden.
- s (x): Der Sinus von x
- c (x): Der Cosinus von x.
- a (x): Der Arkustangens von x
- l (x): Der natürliche Logarithmus von x
- e (x): Die Exponentialfunktion von e zum Wert x
- j (n,x): Die Bessel-Funktion ganzzahliger Ordnung n von x.
Sinus, Cosinus und Arkustangens verwenden Bogenmaßwerte.
s (1.1)
c (.891207)
a (.628473)
Senden von Eingaben an bc über die Befehlszeile
Sie können Umleitungen und Pipes verwenden, um Eingaben an bc zu senden. Es verarbeitet Ihre Eingabe und zeigt die Antwort im Terminalfenster an.
Sie können mit oder ohne die Option -l (Standard-Mathematikbibliothek) zu bc umleiten.
bc <<< 22/7
bc -l <<< 22/7
Um Eingaben an bc weiterzuleiten, müssen die Eingaben die Ausgabe eines anderen Prozesses sein. Es ist praktisch, hierfür echo zu verwenden.
echo 22/7 | bc
echo 22/7 | bc -l
Wenn Ihre Eingabe Leerzeichen enthält oder Sie den Befehl „scale“ einschließen möchten, setzen Sie Ihre Eingabe in Anführungszeichen.
echo „22/7“ | bc -l
echo „scale=6; 22/7“ | bc
Verwenden von bc in Bash-Shell-Skripten
Wir haben jetzt alles, was wir brauchen, um in unseren Bash-Skripten Gleitkommaberechnungen mit der von uns gewünschten Genauigkeit durchführen zu können. Wir können in unseren Berechnungen auch auf Bash-Variablen verweisen, einschließlich Parametern für das Skript.
Hier ist unser Beispielskript. Kopieren Sie diesen Text in einen Editor, speichern Sie ihn als „pi.sh“ und schließen Sie dann Ihren Editor.
#!/bin/bash
first_number=22
second_number=7
pi=$(echo “scale=$1; $first_number/$second_number” | bc)
echo “Pi auf $1 Dezimalstellen ist: $pi”
Wir verwenden zwei Variablen, “first_number” und “second_number”, um zwei numerische Werte zu speichern. Wir verwenden diese Variablen in der Eingabe, die wir in bc weiterleiten.
Wir haben auch den ersten an das Skript übergebenen Befehlszeilenparameter “$1” als Wert verwendet, auf den “scale” eingestellt werden soll.
Bevor wir unser Skript ausprobieren können, müssen wir es mit chmod ausführbar machen.
chmod +x pi.sh
Probieren wir unser Skript mit verschiedenen Befehlszeilenwerten aus.
./pi.sh 5
./pi.sh 14
./pi.sh 20
Wir bekommen Pi an der Anzahl der Stellen angezeigt, die wir in der Befehlszeile unseres Skripts angeben.
Verwandt: So verwenden Sie getopts zum Analysieren von Linux-Shell-Skriptoptionen
Es ergibt alles einen Sinn
Indem wir die Beschränkungen der rein ganzzahligen Mathematik von Bash überwinden, gewinnen unsere Skripte Präzision und Genauigkeit.
Die Verwendung von echo zum Weiterleiten von Eingaben an bc innerhalb von Skripten ist etwas umständlich, funktioniert aber einwandfrei und die Vorteile sind es wert.