Programmierung

Doppelklammern

In einem früheren Artikel über die Bash haben wir uns bereits mit Ersetzungen im Sinne von Befehlssubstitutionen und insbesondere bei der Extraktion von Teilen von Zeichenketten befasst. Es gibt auch Ersetzungen, welche als Arithmetic Expansion bezeichnet werden, bei denen eine arithmetische Operation mit Ganzzahlen durch ihr Ergebnis ersetzt wird.

Arithmetische Ausdrücke können mit dem Bash-Befehl expr formuliert werden:

$ echo `expr $i + 1`
1

oder mit Doppelklammern:

$ echo $((i + 1))
1

Da wir die Variable i nicht zuvor initialisiert haben, hat sie den Wert 0.

Für eine Zuweisung können wir außerdem den Befehl let verwenden. Die folgenden Varianten erhöhen alle den Wert der Variable i(initial immer noch 0, denn in den obigen Beispielen haben wir keine Zuweisung vorgenommen) jeweils um 2:

$ let i=i+2
$ i=`expr $i + 2`
$ i=$((i + 2))
$ echo $i
6

Arithmetische Ersetzungen ermöglichen Schleifen mit einer Zählervariabel. Andernfalls müssten wir die Werte, welche der Zähler durchlaufen soll, als Liste angeben, wie hier die Zahlen von 0 bis 4:

$ for i in 0 1 2 3 4; do echo -n "$i. "; done
0. 1. 2. 3. 4.

Übrigens sind die Ziffern in diesem Beispiel für die Bash keine Zahlen, sondern Zeichenketten. Wir hätten ebenso gut schreiben können:

$ for i in null eins zwei drei vier; do echo -n "$i. "; done
null. eins. zwei. drei. vier.

Mit arithmetischen Ersetzungen können wir eine Schleife mit echter Inkrementierung ähnlich wie in C formulieren.

$ ((i = 0))
$ ((end = 5))
$ while ((i < end)); do echo -n "$((i * 2 + 1)) "; ((i += 1)); done
1 3 5 7 9

Die Zuweisungen in den Doppelklammern werden ausgeführt, ohne dass wir den Weg über den Inhaltsoperator $ gehen müssen. Wir können also statt i=$((i + 1)) auch ((i += 1)) schreiben (bzw. $((i += 1)), wenn wir den Wert des Ausdrucks erhalten wollen).

Eine kürzere Version des obigen Beispiels ist diese.

$ i=0
$ end=5
$ while ((i<end)); do echo -n "$((i*2+1)) "; ((i+=1)); done
1 3 5 7 9

Ohne Doppelklammern müssen wir auf Leerzeichen in Zuweisungen verzichten. Innerhalb von Doppelklammern sind Leerzeichen erlaubt, aber nicht erforderlich.

Mehr über arithmetische Ersetzungen ist im ABS[1] zu lesen.

1. Advanced Bash-Scripting Guide, Chapter 13. Arithmetic Expansion

2. September 2012 von Kai Yves Linden
Kategorien: Programmierung | Schlagwörter: , , | Kommentare deaktiviert für Doppelklammern