Verzweigungen dienen dazu, den üblichen linearen Ablauf eines Scripts zu steuern und umzulenken. Dafür steht uns das if
Statement zur Verfügung.Häufig werden dabei Variablen eingesetzt
1 | Einführung |
---|---|
2 | Der bash Prompt |
3 | key bindings |
4 | Der Startvorgang |
5 | Environment Variablen |
6 | builtin commands |
7 | Arbeiten mit Dateien |
8 | nano |
9 | bash Scripting |
10 | Variablen |
11 | Verzweigungen (if) |
12 | Schleifen |
13 | Kommandozeilenparameter |
14 | exit Codes bash Tutorial Teil 14 |
15 | von der Idee zum Script |
16 | grep |
17 | Piping und Redirection |
18 | tee |
Verzweigungen mit if
Fangen wir mit einem einfachen Beispiel an:
#linear.sh
counter='1'
echo "${counter}"
let counter=counter+1
echo "${counter}"
let counter=counter+1
echo "${counter}"
let counter=counter+1
echo "${counter}"
Das Script macht nichts aufregendes, außer, die Variable counter mit dem Wert 1 zu belegen und dann dreimal um 1 zu erhöhen und den Wert in jedem Schritt auszugeben. Zur Erinnerung: Das let benötigen wir, damit die Zuweisung als mathematischer Ausdruck ausgewertet wird.
Das ist soweit nicht spannend. Um den linearen Ablauf des Scripts zu unterbrechen wollen wir den Wert 3 nicht ausgeben. Umgangssprachlich formuliert bedeutet das: Wenn counter den Wert 3 hat, lass das nachfolgende echo
aus. Übersetzt für unser Script formulieren wir das etwas um: Führe das echo nur aus, wenn counter ungleich 3 ist.
Das if Statement hat folgenden grundsätzlichen Aufbau:
if [ Bedingung ]; then
# Anweisungen
fi
Wichtig ist, die Syntax zu beachten, die Leerzeichen zwischen der Bedingung und den eckigen Klammern dürfen auf keinen Fall ausgelassen werden! Ich weiß gar nicht mehr, wie oft ich anfangs darauf reingefallen bin.
Der Anweisungsblock ( alles zwischen then
und fi
) wird nur dann ausgeführt, wenn die Bedingung true also wahr ist. true
und false
sind das Ergebnis einer Vergleichsoperation. Um etwas zu vergleichen, benötigen wir einen Vergleichsoperator.
Vergleichsoperator | Datentyp | Bedeutung | mathematisch |
---|---|---|---|
-eq | Zahl | gleich | = |
-ne | Zahl | ungleich | ≠ |
-lt | Zahl | kleiner als | < |
-le | Zahl | kleiner gleich | ≤ |
-gt | Zahl | größer als | > |
-ge | Zahl | größer gleich | ≥ |
== | Zeichenkette | gleich | |
!= | Zeichenkette | ungleich | |
> | Zeichenkette | lexikographisch größer als | |
< | Zeichenkette | lexikographisch kleiner als |
Du könntest auch unsere ${counter}
Variable mit ==
oder !=
vergleichen, doch dann wird ihre Zeichenkettenrepräsentation verglichen, nicht ihr nummerischer Wert.
Um den Wert 3 auszulassen, ist die korrekte Bedingung ${counter} -ne 3
. Also der Wert von counter
ist ungleich 3
. Das modifizierte Programm sieht dann so aus:
#skip3rd.sh
counter='1'
echo "${counter}"
let counter=counter+1
echo "${counter}"
let counter=counter+1
if [ ${counter} -ne 3 ]; then
echo "${counter}"
fi
let counter=counter+1
echo "${counter}"
Im Ablauf siehst du, dass die 3 nicht mehr auftaucht.
else
Im nächsten Schritt wollen wir statt der 3 einen alternativen Text ausgeben. Dazu dient das Schlüsselwort else
. Es erweitert den syntaktischen Aufbau des if Statements wie folgt:
if [ Bedingung ]; then
# Anweisungen
else
# alternative Anweisungen
fi
Wenn die Bedingung nicht erfüllt wird, wird statt der Anweisungen hinter then
der Anweisungsblock zwischen else
und fi
ausgeführt.
In unserem Beispiel wollen wir statt des Zahlenwerts 3 jetzt die Zeichenkette „drei“ ausgeben.
#else.sh
counter='1'
echo "${counter}"
let counter=counter+1
echo "${counter}"
let counter=counter+1
if [ ${counter} -ne 3 ]; then
echo "${counter}"
else
echo "drei"
fi
let counter=counter+1
echo "${counter}"
Bedingungen Verknüpfen
Du kannst in einem if auch mehrere Bedingungen angeben. Diese werden dann über ein boolesches AND oder ein boolesches OR miteinander verknüpft.
AND Verknüpfung
Wenn zwei Bedingungen über AND verknüpft sind, wird der then
Teil des if
Statements nur dann durchlaufen wenn beide Bedingungen wahr sind. Das Schlüsselwort für ein boolesche AND ist &&
#and.sh
counter='1'
test=1
echo "${counter}"
let counter=counter+1
echo "${counter}"
let counter=counter+1
if [ ${counter} -eq 3 ] && [ ${test} -eq 2 ]; then
echo "0-drei"
fi
if [ ${counter} -eq 3 ] && [ ${test} -eq 1 ]; then
echo "1-drei"
fi
let counter=counter+1
echo "${counter}"
In diesem Beispiel werden in zwei if jeweils zwei Bedingungen abgefragt, die mit && (also AND) verknüpft sind. Die Variable test
hat fix den Wert 1, wodurch die Bedingung -eq 2
des ersten if
nicht erfüllt sein kann. Das zweite if
testet auf -eq 1
, diese Bedingung ist also erfüllt, genauso wie die erste. Da && insgesamt nur erfüllt ist, wenn beide Bedingungen erfüllt sind, wird nur der then Block des zweiten if ausgeführt.
OR Verknüpfung
Bei der booleschen ODER (OR) Verknüpfung ist die Gesamtbedingung dann erfüllt, wenn eine der beiden Teilbedingungen erfüllt ist. Hierfür wird das Schlüsselwort ||
benutzt.
#or.sh
counter='1'
test=1
echo "${counter}"
let counter=counter+1
echo "${counter}"
let counter=counter+1
if [ ${counter} -eq 3 ] || [ ${test} -eq 2 ]; then
echo "0-drei"
fi
if [ ${counter} -eq 3 ] || [ ${test} -eq 1 ]; then
echo "1-drei"
fi
let counter=counter+1
echo "${counter}"
Hier ist die erste Teilbedingung immer erfüllt, unabhängig vom Ergebnis der zweiten Teilbedingung ist die Gesamtbedingung immer erfüllt, so dass beide then
Blöcke ausgeführt werden, selbst wenn beim ersten if
das -eq 2
niemals erfüllt sein kann.
NOT Verknüpfung
Während &&
und ||
binäre Operatoren sind, ist !
für die Negation (NOT) ein unärer Operator. Seine Aufgabe besteht darin, die nachfolgende Bedingung umzukehren. Anders ausgedrückt, liefert die Bedingung ein true
, macht !
daraus ein false
und umgekehrt. Eigentlich ist Begriff Verknüpfung für !
nicht ganz angebracht, da zu einer Verknüpfung immer zwei Dinge gehören.
#not.sh
counter='1'
test=1
echo "${counter}"
let counter=counter+1
echo "${counter}"
let counter=counter+1
if ! [ ${counter} -eq 3 ] || [ ${test} -eq 2 ]; then
echo "0-drei"
fi
if [ ${counter} -eq 3 ] || [ ${test} -eq 1 ]; then
echo "1-drei"
fi
let counter=counter+1
echo "${counter}"
Das Beispiel ist dem or.sh sehr ähnlich mit dem Unterschied, dass die erste Bedingung der ersten if negiert wird. Obwohl counter den Wert 3 hat, wird durch die Negation ein false, wodurch auch die Verknüpfung mit || insgesamt nicht mehr erfüllt ist. Die Zeile „0-drei“ wird nicht mehr ausgegeben.
Ich habe für die Ergebnisse der Operatoren in einer Matrix zusammengefasst.
Operator | Wert1 | Wert2 | Ergebnis |
---|---|---|---|
NOT | true | – | false |
NOT | false | – | true |
AND | true | true | true |
AND | true | false | false |
AND | false | false | false |
OR | true | true | true |
OR | true | false | true |
OR | false | true | true |
OR | false | false | false |
Mit if kannst auch das Ergebnis eines aufgerufenen Programms überprüfen, das zeige ich dir später. In nächsten Kapitel werden wir dann Schleifen kennenlernen.