Shellskripte mit Aha-Effekt: Zahlenspiele
Manchmal muss man Zahlen zu einer anderen Zahlensystem-Basis darstellen, zum Beispiel vom Dual- oder Binärsystem (Basis 2) zum Sedezimal- oder Hexadezimalsystem (Basis 16). So lässt sich auch mit IP-Adressen oder Netzmasken herumrechnen.
Es ist immer wieder faszinierend, wie viel man mit der Shell erledigen kann, bevor man zu einer Programmiersprache greifen muss. Nicht zuletzt sind daran auch die zahlreichen Unterprogramme beteiligt, nämlich alle Kommandozeilen-Tools, die sich auf der Platte tummeln. Manchmal trifft man auch auf Systeme, die aus Sicherheitsgründen nur wenig mit Tools bevölkert sind. Aber auch da muss man nicht gleich aufgeben.
Bei den meisten Linux-Distributionen und Unix-Systemen ist der bc verfügbar. Das Tool bc - An arbitrary precision calculator language ist ein Rechner auf der Kommandozeile. Die GNU-Version ist sogar programmierbar. Er rechnet in beliebiger Genauigkeit und beherrscht auch etliche mathematische Funktionen, die der Kommandozeilenparameter -l aktiviert: Unter anderem sind das Sinus s(x), Cosinus c(x), beide im Bogenmaß), Arcustangens a(x), die Exponentialfunktion e(x), der natürliche Logarithmus l(x) und die Quadratwurzel sqrt(x).
Der bc besitzt weder einen Eingabe- noch einen Ausgabeprompt. Nach der Begrüßung rechnet man im interaktiven Modus sofort los. Wie in der Shell kann man mit den Auf- und Ab-Pfeiltasten die letzten Eingaben zurückholen und editieren. Die Eingabe quit beendet das Programm im interaktiven Modus. In einer Pipe erledigt der bc seine Rechenaufgabe und beendet sich dann sofort.
Das folgende Listing zeigt, was passiert, wenn man einfach mal drauf los probiert (Zeile 03). Es gehen auch große Zahlen, wie Zeile 06 zeigt. Zeile 09 berechnet die Kreiszahl Pi: Der Standard sind 20 Stellen, aber wer mehr will, bekommt auch mehr. Zeilen 14 und 15 definieren eine Funktion und wenden sie an. Auch Gleitpunktzahlen gehen (Zeile 18). Am Schluss haben wir das übliche Problem bei begrenzter Stellenzahl:
01 $ bc -l -q 02 03 4*5+12+4 04 36 05 06 2^100 07 1267650600228229401496703205376 08 09 4*a(1) 10 3.14159265358979323844 11 scale=100; 4*a(1) 12 3.141592653589793238462643383279502 \ 884197169399375105820974944592307 \ 8164062862089986280348253421170676 13 14 define f(x) {x^3} 15 f(5) 16 125 17 18 2.345*2 19 4.690 20 21 (100/3)*3 22 99.99999999999999999999
Aber dies soll ja kein bc-Kurs werden, sondern das Tool soll für Zahlenumwandlung zum Einsatz kommen.