Verzweigungen bash Tutorial Teil 11

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

bash Logo - Verzweigungen
Dr. Dirk Colbry, Michigan State
Gnu-bash-logoCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
1Einführung
2Der bash Prompt
3key bindings
4Der Startvorgang
5Environment Variablen
6builtin commands
7Arbeiten mit Dateien
8nano
9bash Scripting
10Variablen
11Verzweigungen (if)
12Schleifen
13Kommandozeilenparameter
14exit Codes bash Tutorial Teil 14
15von der Idee zum Script
16grep
17Piping und Redirection
18tee

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.

Ausgabe der Werte von 1 bis 4 durch das Script linear.sh
Olli Graf - raspithek.de
linearCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Ausgabe der Werte von 1 bis 4 durch das Script linear.sh

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.

VergleichsoperatorDatentypBedeutungmathematisch
-eqZahlgleich=
-neZahlungleich
-ltZahlkleiner als<
-leZahlkleiner gleich
-gtZahlgrößer als>
-geZahlgrößer gleich
==Zeichenkettegleich
!=Zeichenketteungleich
>Zeichenkettelexikographisch größer als
<Zeichenkettelexikographisch 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.

Durch das if wird der Wert 3 nicht ausgegeben
Olli Graf - raspithek.de
skip3rdCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Durch das if wird der Wert 3 nicht ausgegeben

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}"
Der Ablauf mit else. Statt 3 steht da "drei".
Olli Graf - raspithek.de
elseCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Der Ablauf mit else. Statt 3 steht da „drei“.

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.

Ausgabe von and.sh, die Zeile 1-drei stammt vom then Block des zweiten if
Olli Graf - raspithek.de
andCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Ausgabe von and.sh, die Zeile 1-drei stammt vom then Block des zweiten if

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.

Die Ausgabe von or.sh, die Ausgaben beider then Blöcke sind zu sehen.
Olli Graf - raspithek.de
orCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Die Ausgabe von or.sh, die Ausgaben beider then Blöcke sind zu sehen.

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.

Olli Graf - raspithek.de
notCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

Ich habe für die Ergebnisse der Operatoren in einer Matrix zusammengefasst.

OperatorWert1Wert2Ergebnis
NOTtruefalse
NOTfalsetrue
ANDtruetruetrue
ANDtruefalsefalse
ANDfalsefalsefalse
ORtruetruetrue
ORtruefalsetrue
ORfalsetruetrue
ORfalsefalsefalse

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.

Schreibe einen Kommentar

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner