7.3 Rechnen in der Shell
Rechnen kann man in der Shell auf verschiedene Weisen. Man kann über ein awk-Skript, über eine Pipe mit dem bc, via expr oder über Integer-Variablen eine Rechnung ausführen lassen. awk und den bc kennen Sie ja bereits. Nun werden wir uns mit expr und Integer-Variablen beschäftigen.
7.3.1 Integer-Variablen
typeset -i
Integer-Variablen können in der Bourne-Again-, Korn- und Z-Shell über das Kommando typeset -i angelegt werden. Anschließend kann durch erneute Wertzuweisung mit einer Variable gerechnet werden. Möglich sind dabei nicht nur Addition, Subtraktion, Division (allerdings ohne Kommastellen!), Multiplikation und Modulo, sondern auch das aus C bekannte Bit-Shiften durch >>n und < <n sowie ein bitweises UND (&), ODER (|), XOR (^) und Negieren (~). Außerdem möglich sind die ebenfalls aus awk und C bekannten Abkürzungsoperatoren wie +=, -= oder ^=.
$ typeset -i zahl $ zahl=301*2 $ echo $zahl 602 $ zahl=$zahl+1 $ zahl=$zahl/3 $ echo $zahl 201 $ zahl=8\<\<3 1024
Listing 7.7 typeset -i anwenden
Um einer Variable einen Wert zuzuweisen, benutzt man nur den Namen der Variable. Um aber auf den Wert einer Variable zuzugreifen, muss dem Variablennamen ein Dollarzeichen ($) vorangestellt werden.
Achten Sie außerdem immer darauf, Sonderzeichen wie ( oder > in Ihren Rechnungen durch einen Backslash vor der Interpretation durch die Shell zu schützen. Eine bloße Klammerung würde beispielsweise als Subshell und ein > als Ausgabeumlenkung interpretiert werden.
let
Eine weitere Möglichkeit, mit Integer-Variablen zu arbeiten, ist die Nutzung des let-Befehls in der Form
$ let x=37+13
$ echo x
50
Listing 7.8 let
sowie die Verwendung einer doppelten Klammerung für eine Rechnung
$ ((produkt=37*13))
$ echo $produkt
481
Listing 7.9 (( ... ))
und eckige Klammern in bash und zsh:
$ z=$[13*37]
$ echo $
481
Listing 7.10 Eckige Klammern
7.3.2 expr
Eine Möglichkeit, die in jeder Shell funktioniert, um Rechnungen durchzuführen, ist expr. Dem Programm wird dabei die entsprechende Rechnung übergeben. Die Ausgabe erfolgt entweder über die Standardausgabe oder man weist das Ergebnis durch eine Kommandosubstitution an eine Variable zu.
$ expr 13 + 37
$ ergebnis=`expr 13 + 37`
$ echo $ergebnis
50
Listing 7.11 expr
7.3.3 Den bc nutzen
Den bc kennen Sie ja bereits aus Abschnitt 5.8.1. Er stellt einige zusätzliche Rechenfunktionen bereit, die in der bloßen Shellskriptprogrammierung nicht möglich sind, etwa die Berechnung von Kommawerten. Wenn man solche Aufgaben lösen muss, kann man ganz einfach den bc in eine Berechnung einbinden, was folgendermaßen geschrieben wird:
$ echo "scale=5; 31.2/494" | bc .06315 $ ergebnis=`echo "scale=5; 31.2/494" | bc` $ echo $ergebnis .06315
Listing 7.12 bc und Shell-Variablen