Zu Befehl: bash, bc

Aus LinuxUser 04/2004

Zu Befehl: bash, bc

Die Rechnung bitte!

Es muss nicht immer ein grafischer Taschenrechner wie xcalc oder KCalc sein – auch die Bash beherrscht einfache arithmetische Operationen, und für die fortgeschrittenen Mathematiker gibt’s bc.

Zu Befehl

Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Die Bash (Bourne Again Shell) ist die Standard-Shell unter Linux. Sie nimmt Kommandos entgegen und interpretiert sie, startet Programme und verwaltet Prozesse. Außerdem speichert die Bash Umgebungsvariablen und stellt diese anderen Programmen zur Verfügung. Neben zahlreichen Programmiersprachen-Features beherrscht die Bash darüber hinaus die vier Grundrechenarten (Addition, Subtraktion, Multiplikation und Division) und den Modulo-Operator und kann damit arithmetische Ausdrücke auswerten.

Da die Bash aber nur mit Integer-Werten (ganzen Zahlen ohne Nachkommastellen) bis zu 32 Bit umgehen kann, stößt man schnell an ihre mathematischen Grenzen. Wer mit Fließkommazahlen rechnen möchte, kann den Taschenrechner bc (“Basic Calculator”) zu Hilfe nehmen. Das Programm bedienen Sie interaktiv, können es aber auch in Shell-Skripte einbauen.

Damit müssen Sie rechnen

Für mathematische Aufgaben verwenden Sie in der Bash eine spezielle Syntax: Bei älteren Bash-Versionen steht ein Dollar-Zeichen vor eckigen Klammern mit dem arithmetischen Ausdruck; seit Bash 2.0 wird der Ausdruck in doppelte runde Klammern eingeschlossen. Auch wenn die neuen Bash-Versionen noch mit der alten Schreibweise umgehen können, verwenden wir hier die doppelten runden Klammern.

Die Bash rechnet mit “normalen” Zahlen und Variablen, z. B.:

huhn@asteroid:~$ echo $((1+1))
2

Alternativ definieren Sie vorher Variablen, weisen diesen einen Wert zu und rechnen anschließend damit:

huhn@asteroid:~$ a=4
huhn@asteroid:~$ b=5
huhn@asteroid:~$ echo $((a*b))
20
huhn@asteroid:~$ echo $((a-b))
-1

Um diese Zuweisungen und Berechnungen in einer Zeile unterzubringen, können Sie das Semikolon verwenden, welches Befehle miteinander verbindet. Das eben gezeigte Beispiel lässt sich also auch als

a=4; b=5; echo $((a*b))

in einer Zeile schreiben. Weitere Operatoren sind das Minuszeichen (-) für die Subtraktion, das Sternchen (*) für die Multiplikation und der Schrägstrich (/) für die ganzzahlige Division.

Ein doppeltes Sternchen (**) dient als Exponential-Operator, also beispielsweise echo $((2**16)), und das Prozentzeichen steht für den Modulo-Operator, der den Rest bei der ganzzahligen Division berechnet, z. B. ergibt echo $((5%3)) das Ergebnis 2, weil beim Teilen von 5 durch 3 der Rest 2 bleibt.

Aber bitte mit Komma

Spätestens bei der Eingabe von echo $((1/3)) fällt auf, dass die Division wirklich ganzzahlig ist; mit Nachkommastellen kann die Bash nicht umgehen. Hier kommt bc zum Einsatz. Sie starten den Taschenrechner mit dem Befehl bc.

Zunächst etwas verwirrend ist, dass Sie keinen Prompt sehen – bc wartet aber dennoch auf Ihre Befehle. Beenden können Sie den Taschenrechner jederzeit durch Eingabe von quit oder mit [Strg-d].

Arithmetische Ausdrücke setzen Sie wie gewohnt aus den Operatoren +, -, * und / sowie Klammern zusammen:

(1.1+2)*2 [Return]
6.2

Das Komma ist der englischen Schreibweise folgend ein Punkt; nach Eingabe des Ausdrucks drücken Sie [Return], und bc verrät das Ergebnis. Mehrere Aufgaben geben Sie einfach hintereinander ein und trennen sie mit einem Semikolon:

1.1+2; 3.1-2 [Return]
3.1
1.1

bc speichert alle Befehle in einer History. So blättern Sie mit den Pfeiltasten in den letzten Kommandos hoch und runter, wie Sie es von der Shell kennen.

Während die Operatoren für die vier Grundrechenarten in bc mit denen der Bash identisch sind, unterscheiden sich die Exponential-Operatoren: bc verwendet das Dach (^) statt eines doppelten Sternchens.

Alles variabel

Verwenden Sie in einer Rechnung immer wieder dieselbe Zahl, können Sie diese vorher als Variable deklarieren. Einen Wert weisen Sie wie in der Bash mit einem Gleichheitszeichen zu, z. B.:

a=201; b=300

Dass die Variablen nun “gespeichert” sind, verrät bc leider nicht. Den Wert von a und b erfahren Sie nur, wenn Sie den Namen der Variablen gefolgt von [Return] eingeben – sehr gesprächig ist bc nicht.

Die vorher definierten Variablen können Sie nun wie Zahlen in Berechnungen nutzen:

a*b
60300a+b
501

Wer versucht, mit diesen beiden Variablen eine Division durchzuführen, erlebt eine Überraschung: bc gibt als Ergebnis einfach 0 aus. Soll der Taschenrechner Fließkommazahlen errechnen, starten Sie das Programm mit dem Parameter -l. Alternativ können Sie die Nachkommastellen im laufenden Betrieb einstellen. Durch den Befehl scale=wert (wobei der Wert zwischen 0 und 99 liegen darf) geben Sie vor, wie viele Nachkommastellen bc anzeigt (und berechnet):

scale=23 [Return]a/b [Return]
.67000000000000000000000

Beim Dividieren fällt übrigens auf, dass bc unter dem gleichen Problem leidet, das alle Programme haben, die mit fester Anzahl von Nachkommastellen rechnen: Es treten Rundungsfehler auf. So ergibt die Berechnung von 1/3*3 den Wert 0.999999999 (mit so vielen Neunen, wie Nachkommastellen verwendet werden), während der mathematisch gleiche Ausdruck 1/(3/3) richtig als 1 berechnet wird.

Mit einem Minuszeichen als Vorzeichen hat bc überhaupt keine Probleme – Sie können dieses einfach voranstellen:

a + -b
-99-a
-201

Andere Welten

bc hat aber noch mehr im Programm, so gibt es verschiedene mathematische Funktionen, wie etwa die Quadratwurzel:

sqrt(144)
12

Der Befehl sqrt ist übrigens die Abkürzung für das englische Wort “square root”.

Standardmäßig rechnet bc im Dezimalsystem, d. h. die Basis ist 10. Eine andere Basis für jedes beliebige andere Zahlensystem legen Sie aber ganz einfach fest:

ibase=16A
10

Nach Aufruf des ibase-Kommandos interpretiert bc alle Eingaben hexadezimal – auch den Versuch, mit ibase=10 auf dezimal zurückzuschalten. bc erwartet hexadezimale Eingaben, daher interpretiert das Programm die 10 als dezimale 16 und schaltet nicht um. Der korrekte Aufruf lautet statt dessen ibase=A. Um zu kontrollieren, auf welchem Zahlensystem die Eingabe gerade steht, tippen Sie einfach nur ibase – ohne weitere Parameter.

Während ibase die Eingabe beeinflusst, legt obase das Zahlensystem für die Ausgabe fest. Wer also den hexadezimalen Wert für 15 wissen möchte, tippt:

obase=16 [Return]15 [Return]
F

Beim Zurücksetzen von obase gibt es dementsprechend keine Probleme – obase=10 funktioniert, wenn Sie nicht auch mit ibase die Eingabe umgestellt haben.

Kontrolliert

bc ist, wie ein Blick in die Manpage verrät, eigentlich eine Programmiersprache. Daher können Sie Kontrollstrukturen, wie man sie beispielsweise aus C oder C++ kennt, für kompliziertere Aufgaben verwenden. Wer die Quadratzahlen von 1 bis 10 ausgeben möchte, spart sich durch eine einfache for-Schleife jede Menge Tipparbeit:

for (i=1; i<=10; i++) print i^2,"\n";
1
4
9
16
25
36
49
64
81
100

Die Syntax dieser Schleife ist schnell erklärt: In den Klammern befinden sich drei Ausdrücke, dahinter eine Anweisung. Der erste Ausdruck (i=1) wird vor Beginn der Schleife einmal ausgeführt. Die Anweisung wird solange wiederholt, wie der zweite Ausdruck wahr ist, also i<=10 ist. Nach jedem Schritt wird der dritte Ausdruck ausgeführt, also i inkrementiert.

Für einmalige schnelle Berechnungen müssen Sie bc nicht jedes Mal starten, den Befehl eingeben und den Taschenrechner wieder beenden – Sie können ganz einfach Aufgaben durch ein Pipe-Zeichen an bc weitergeben und auf diese Weise auch die Bash zur Ausgabe von Kommazahlen überreden:

huhn@asteroid:~$ echo 1/3 | bc -l
.33333333333333333333

Mit Hilfe des Backticks (`) können Sie solche Berechnungen sogar in Shell-Variablen speichern:

x=`echo "$a*$b" | bc -l`

multipliziert die Werte der Shell-Variablen a und b und speichert das Ergebnis in x.

LinuxUser 04/2004 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben