11.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 Berechnung ausführen lassen. Den awk-Interpreter und den bc kennen Sie ja bereits. Nun werden wir uns mit expr und Integer-Variablen beschäftigen.
11.3.1 Integer-Variablen
typeset -i
Integer-Variablen können Sie in der Bourne-Again-, Korn- und Z-Shell über das Kommando typeset -i angelegen. Anschließend können Sie durch erneute Wertzuweisung mit einer Variable rechnen. Möglich sind dabei nicht nur Addition, Subtraktion, Division (allerdings ohne Kommastellen!), Multiplikation und Modulo, sondern auch das aus C bekannte Bit-Shiften mit >>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 ^=.
Listing 11.7 typeset -i anwenden
$ typeset -i zahl
$ zahl=301*2
$ echo $zahl
602
$ zahl=$zahl+1
$ zahl=$zahl/3
$ echo $zahl
201
$ zahl=8\<\<3
1024
Um einer Variablen einen Wert zuzuweisen, benutzt man nur ihren Namen. Will man dagegen auf ihren Wert zugreifen, muss man dem Variablennamen ein Dollarzeichen ($) voranstellen.
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
Weitere Möglichkeiten, mit Integer-Variablen zu arbeiten, sind die Nutzung des let-Befehls:
Listing 11.8 Der Befehl let
$ let x=37+13
$ echo $x
50
sowie die doppelte Klammerung:
Listing 11.9 (( ... ))
$ ((produkt=37*13))
$ echo $produkt
481
und, in bash und zsh, eckige Klammern:
Listing 11.10 Eckige Klammern
$ z=$[13*37]
$ echo $z
481
11.3.2 expr
Eine Möglichkeit , Rechnungen durchzuführen, die in jeder Shell funktioniert, um ist expr. Dem Programm wird dabei der entsprechende Term übergeben. Die Ausgabe erfolgt entweder über die Standardausgabe oder man weist das Ergebnis durch eine Kommandosubstitution einer Variablen zu.
Listing 11.11 Das Programm expr
$ expr 13 + 37
$ ergebnis=`expr 13 + 37`
$ echo $ergebnis
50
11.3.3 Den bc nutzen
Den Konsolenrechner bc kennen Sie bereits aus Abschnitt abschnitt_bc. Er stellt einige zusätzliche Rechenfunktionen bereit, die in der reinen Shellskriptprogrammierung nicht möglich sind, etwa das Rechnen mit Dezimalbrüchen. Wenn man solche Aufgaben lösen muss, kann man ganz einfach den bc in eine Berechnung einbinden, was folgendermaßen notiert wird:
Listing 11.12 bc und Shellvariablen
$ echo "scale=5; 31.2/494" | bc
.06315
$ ergebnis=`echo "scale=5; 31.2/494" | bc`
$ echo $ergebnis
.06315
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.