HOWTO · Linux

Wie man Inkrement- und Dekrementoperationen in Bash durchführt

Um variable Inkrementierung und Dekrementierung in Bash durchzuführen, können wir + und - Operatoren oder += und -= Operatoren verwenden. Wir können auch Inkrementierung und Dekrementierung in Bash mit unären Operatoren durchführen: ++ und --.

Auf dieser Seite

Inkrementierungs- und Dekrementierungsoperationen ändern eine ganzzahlige Variable um einen festen Betrag. In Bash unterstützen arithmetische Expansionen, arithmetische Befehle, let, zusammengesetzte Zuweisungen und unäre Operatoren solche Änderungen. Wähle die Schreibweise, bei der der Betrag und der anschließend verwendete Wert am leichtesten zu erkennen sind.

Inkrementieren und Dekrementieren mit + und -

Eine arithmetische Expansion in der Form $((...)) liefert einen Wert, den du zuweisen oder ausgeben kannst. Ein arithmetischer Befehl, ((...)), wertet einen Ausdruck aus und kann Variablen direkt ändern. Auch das eingebaute let wertet arithmetische Ausdrücke aus. Setze den Ausdruck in Anführungszeichen, damit die Shell ihn als ein Argument übergibt.

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

x=3
y=3
z=3
x=$((x + 1))
((y = y + 1))
let "z=z+1"
printf 'x: %s\ny: %s\nz: %s\n' "$x" "$y" "$z"
x=$((x - 1))
((y = y - 1))
let "z=z-1"

Die ersten drei Aktualisierungen addieren auf unterschiedliche arithmetische Arten jeweils eins; die letzten drei subtrahieren eins. Eine arithmetische Expansion ist nützlich, wenn du den Wert eines Ausdrucks brauchst. Arithmetische Befehle und let eignen sich gut zum Aktualisieren von Variablen. Die Arithmetik in Bash arbeitet mit Ganzzahlen.

Mit += und -= arithmetische Aktualisierungen vornehmen

Die zusammengesetzten Zuweisungen x+=amount und x-=amount addieren beziehungsweise subtrahieren die rechte Ganzzahl zur oder von der links stehenden Variablen. Sie entsprechen x=x+amount und x=x-amount. Verwende sie, wenn der Aktualisierungsbetrag größer als eins ist oder auf einen Blick erkennbar sein soll.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

count=10
((count += 3))
printf 'after adding 3: %s\n' "$count"
((count -= 2))
printf 'after subtracting 2: %s\n' "$count"

Diese Ausdrücke ändern count direkt. Der Status eines arithmetischen Befehls hängt davon ab, ob sein Ausdruck zu null ausgewertet wird. Verlasse dich daher nicht auf diesen Status als Erfolgsanzeige für eine Aktualisierung.

Mit ++ und -- einzelne Schritte ausführen

Die unären Operatoren ++ und -- addieren beziehungsweise subtrahieren genau eins. Als eigenständige arithmetische Befehle aktualisieren ((count++)), ((++count)), ((count--)) und ((--count)) die Variable.

Wird der Wert des Operators in einem Ausdruck verwendet, unterscheiden sich Präfix und Postfix: ++count aktualisiert die Variable zuerst und liefert den neuen Wert; count++ liefert zuerst den alten Wert und aktualisiert sie anschließend. Für -- gilt dieselbe Reihenfolge. Wenn nur der resultierende Variablenwert wichtig ist, schreibe die Aktualisierung als eigene Anweisung, um Unklarheiten zu vermeiden.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

count=4
old=$((count++))
printf 'old: %s, count: %s\n' "$old" "$count"
new=$((++count))
printf 'new: %s, count: %s\n' "$new" "$count"

Inkrementieren und Dekrementieren in Schleifen verwenden

Die Bedingung einer Schleife legt fest, wann sie endet. Die Aktualisierung bewegt den Zähler auf dieses Ende zu. Achte darauf, dass beides zusammenpasst: Für einen steigenden Zähler brauchst du eine obere Grenze, für einen sinkenden Zähler eine untere Grenze.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

for ((count = 1; count <= 3; count++)); do
  printf '%s\n' "$count"
done

count=3
while ((count >= 1)); do
  printf '%s\n' "$count"
  ((count--))
done

Die for-Schleife fasst Initialisierung, Bedingung und Inkrement in ihrem Kopf zusammen. Bei der while-Schleife steht die Bedingung vor dem Schleifenkörper und die Dekrementierung darin. Stelle sicher, dass jede Aktualisierung den Ausdruck der Schleifenbedingung schließlich falsch werden lässt.

Grenzen der Bash-Arithmetik und häufige Fragen

Die Arithmetik in Bash basiert auf Ganzzahlen und bietet keine native Gleitkommaarithmetik. Für Dezimalrechnungen kannst du einen geeigneten externen Rechner oder eine Sprache mit Gleitkommaunterstützung verwenden. Berücksichtige dabei, dass dieses Werkzeug eine separate Abhängigkeit darstellt.

Sowohl ++ als auch += 1 erhöhen eine Variable um eins. Die unäre Schreibweise ist kompakt; die zusammengesetzte Zuweisung macht den Betrag ausdrücklich sichtbar und eignet sich auch für größere Aktualisierungen. Präfix und Postfix sind nur dann relevant, wenn der Wert des Ausdrucks verwendet wird, wie oben beschrieben.

Ein arithmetischer Befehl liefert Status 1, wenn sein Ausdruck zu null ausgewertet wird, andernfalls Status 0. Bei ((count--)) verwendet der Ausdruck den Wert vor der Dekrementierung: Wird count von 1 auf 0 gesetzt, ergibt sich Status 0. Beginnt der Wert dagegen bei 0, ergibt sich Status 1, obwohl die Variable anschließend den Wert -1 hat. Bei ((--count)) und ((count -= 1)) verwendet der Ausdruck den Wert nach der Dekrementierung. Wird der Wert von 1 auf 0 geändert, ergibt sich deshalb Status 1. Dieser Unterschied ist wichtig, wenn ein arithmetischer Befehl als if- oder while-Bedingung oder mit set -e als einfacher Befehl verwendet wird: Ein Status ungleich null kann den Kontrollfluss beeinflussen. In der obigen Dekrementierungsschleife liefert ((count--)) beim Übergang von 1 auf 0 Status 0; anschließend beendet die ausdrücklich geprüfte Bedingung ((count >= 1)) die Schleife.