Numerische Ausdrücke $(( ... ))

Innerhalb des Operators $(( ... )) wird ein arithmetischer Ausdruck ausgewertet. Dieser wird mit langen Ganzzahlen (vier Byte) vorzeichenbehaftet berechnet; Ergebnis ist ein String, der die berechnete Zahl repräsentiert. Die Operanden können Konstanten (in oktaler Schreibweise, wenn sie mit der Ziffer 0 beginnen, in hexadezimaler Schreibweise, wenn sie mit 0x oder 0X beginnen, sonst dezimal) sein oder die üblichen Variablen (Variablen, Parameter).

Eine Schachtelung solcher arithmetischen Ausdrücke ist möglich.

Als wahr und falsch gilt wie in C und ebenso wie in eval-Ausdrücken (Numerik light mit expr) ,,0 ist false, alles andere true``, also entgegengesetzt der in der Shell sonst verwendeten Faustformel, daß ein Kommando wahr beziehungsweise erfolgreich mit dem Wert 0 signalisiert (test-Ausdrücke, true, false).

Beispiel 11   Die Zeile i=4; j=5; j=$(( $((k = 2*i+j)) -2 )) setzt i auf den Wert 4, j auf anfangs 5, dann k auf 13 und letztlich nochmals j auf 11.

Man muß also die Variablen nicht explizit durch ein vorangestelltes $-Zeichen expandieren, dürfte es aber: $((k = 2*i+j)) kommt auf das selbe Ergebnis wie $((k = 2*$i+$j)); in letzterem Fall würden die Variablen in einem früheren Schritt durch ihren Wert ersetzt werden und die Berechnung erfolgt dann letztlich mit Konstanten (dem Ergebnis der Expansion).

Bei einer Zuweisung an eine Variable (oder beim Inkrementieren mit ++ oder Dekrementieren mit --) darf allerdings vor den Variablen kein $ stehen, weil die Veränderung der expandierten Konstanten nicht möglich ist.

Neben dem Operator $(( )) gibt es noch die let-Anweisung, der man einen oder mehrere zu berechnende Ausdrücke als Argumente übergibt. Dabei muß man allerdings die Ausdrücke meistens durch quoten vor einer zu frühen Auswertung durch die Shell schützen, beispielsweise
let "k = 3 + 6"
Derselbe Ausdruck ohne Gänsefüßchen würde nicht funktionieren, weil vor dem Ausführen von let die Shell bereits das Gleichheitszeichen entdeckt und dadurch eine direkte Zuweisung versucht, ohne den arithmetischen Ausdruck auszuwerten. (Ohne Leerzeichen, also let "k=3+6", würde es zufällig klappen, weil das Gleichheitszeichen für die Shell in einem Wort versteckt ist.)

Folgende Operatoren stehen zur Verfügung:

AnyWare@Wachtler.de