Shell Scripting · 7 min read · Nov 13, 2025
Shell-Skripting Teil 3: Entscheidungssteuerungsstrukturen in Shell-Skripten
Hi! Wir haben bereits die Grundlagen des Shell-Skriptings behandelt, wie das Akzeptieren von Eingaben, das Verarbeiten von Daten durch arithmetische Operationen und das Generieren und Anzeigen von Ausgaben in den vorherigen Teilen dieses Tutorials (Teil 1 und Teil 2). In diesem Teil werden wir tiefer in ein fortgeschritteneres Thema einer Programmiersprache eintauchen – Entscheidungen in einem Programm zu treffen, aber diesmal werden wir es mit der Bash-Shell tun. Lass uns anfangen!
Einführung
Die meisten unserer heutigen Programmiersprachen sind in der Lage, Entscheidungen basierend auf Bedingungen zu treffen, die wir festlegen. Eine Bedingung ist ein Ausdruck, der zu einem booleschen Wert evaluiert – wahr oder falsch. Jeder Programmierer kann sein Programm intelligent gestalten, basierend auf den Entscheidungen und der Logik, die er in sein Programm einfügt. Die Bash-Shell unterstützt if- und switch (case)-Entscheidungsanweisungen.
If-Anweisung
If ist eine Anweisung, die es dem Programmierer ermöglicht, eine Entscheidung im Programm basierend auf den von ihm festgelegten Bedingungen zu treffen. Wenn die Bedingung erfüllt ist, wird das Programm bestimmte Codezeilen ausführen, andernfalls wird das Programm andere Aufgaben ausführen, die der Programmierer festgelegt hat. Die folgende Syntax wird in der Bash-Shell unterstützt.
Allgemeine Syntax
Einfache Entscheidung:
if
then
### Reihe von Code kommt hierhin
fi Doppelte Entscheidung:
if
then
### Reihe von Code, wenn die Bedingung erfüllt ist
else
### Reihe von Code, wenn die Bedingung nicht erfüllt ist
fi Mehrfache if-Bedingung:
if
then
### Reihe von Code für condition1
elif
then
### Reihe von Code für condition2
else
### Reihe von Code, wenn die Bedingung nicht erfüllt ist
fi Einzelklammer-Syntax
if [ condition ]
then
### Reihe von Code kommt hierhin
fiDoppelte Klammer-Syntax
if ((condition))
then
### Reihe von Code kommt hierhin
fiDie Einzelklammer-Syntax ist die älteste unterstützte Syntax in der Bash-Shell. Sie wird zusammen mit allen bedingten Anweisungen in Linux verwendet. In der Zwischenzeit wird die doppelte Klammer-Syntax für eine zahlenbasierte bedingte Anweisung verwendet, um Programmierern eine vertraute Syntax zu bieten. Alle Arten von if-Anweisungen benötigen eine festgelegte Bedingung, um eine Aufgabe auszuführen.
Bedingte Anweisungen in Linux
Bedingte Anweisungen werden zusammen mit einer Entscheidungssteuerungsanweisung verwendet. Es gibt verschiedene Arten von bedingten Anweisungen, die Sie in der Bash-Shell verwenden können, die häufigsten sind: dateibasiert, stringbasiert und arithmetisch-basiert.
Dateibasierte Bedingung
Dateibasierte Bedingungen sind unäre Ausdrücke und werden häufig verwendet, um den Status einer Datei zu überprüfen. Die folgende Liste zeigt die am häufigsten verwendeten dateibasierten Bedingungen in der Bash-Shell.
| Operator | Beschreibung |
| -a file | Gibt wahr zurück, wenn die Datei existiert |
| -b file | Gibt wahr zurück, wenn die Datei existiert und eine Block-Sonderdatei ist |
| -c file | Gibt wahr zurück, wenn die Datei existiert und eine Zeichen-Sonderdatei ist |
| -d file | Gibt wahr zurück, wenn die Datei existiert und ein Verzeichnis ist |
| -e file | Gibt wahr zurück, wenn die Datei existiert |
| -r file | Gibt wahr zurück, wenn die Datei existiert und lesbar ist |
| -s file | Gibt wahr zurück, wenn die Datei existiert und eine Größe größer als null hat |
| -s file | Gibt wahr zurück, wenn die Datei existiert und eine Größe größer als null hat |
| -w file | Gibt wahr zurück, wenn die Datei existiert und beschreibbar ist |
| -x file | Gibt wahr zurück, wenn die Datei existiert und ausführbar ist |
| -N file | Gibt wahr zurück, wenn die Datei existiert und seit dem letzten Lesen geändert wurde |
Eine dateibasierte Entscheidung treffen
Lass uns ein Beispiel betrachten, das veranschaulicht, wie man eine dateibasierte Entscheidung in einem Bash-Skript konstruiert. In diesem Beispiel werden wir ein Skript erstellen, das bestimmt, ob die Datei im Home-Verzeichnis existiert.
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "Datei existiert!"
else
echo "Datei existiert nicht"
fi
In diesem Beispiel haben wir sichergestellt, dass die Shell zum Home-Verzeichnis zurückkehrt, unabhängig von unserem aktuellen aktiven Verzeichnis, indem wir den cd-Befehl verwenden. Zusätzlich wird der ls-Befehl verwendet, um die Liste der Dateien im Verzeichnis anzuzeigen, damit wir überprüfen können, ob die Datei wirklich existiert oder nicht. Wie Sie sehen können, gibt das Skript den Text “Datei existiert!” aus, weil sich die sample.sh im Home-Verzeichnis befindet.
Hinweis: Der Shell-Compiler ist in Bezug auf die Syntax, insbesondere bei Leerzeichen, sehr streng. Es sollte ein Leerzeichen zwischen if und der öffnenden Klammer und zwischen den Klammern und der Bedingung geben.Jetzt lass uns unser Skript verbessern, indem wir unseren Code dynamischer gestalten, indem wir dem Benutzer erlauben, einen Dateinamen einzugeben und die Berechtigungen der angegebenen Datei zu bestimmen.
#!/bin/bash
cd
ls -l
read -p "Geben Sie einen Dateinamen ein: " filename
if [ -e $filename ]
then
echo "Datei existiert!"
if [ -r $filename ]
then
status="lesbar "
fi
if [ -w $filename ]
then
status=$status"beschreibbar "
fi
if [ -x $filename ]
then
status=$status"ausführbar"
fi
echo "Dateiberechtigung: "$status
else
echo "Datei existiert nicht"
fi
String-basierte Bedingung
Entscheidungen basierend auf einer vom Benutzer eingegebenen Zeichenfolge sind ebenfalls in der Bash-Shell möglich. Die stringbasierte Bedingung gibt einen binären Ausdruck als Ergebnis zurück, was bedeutet, dass sie wahr zurückgibt, wenn die angegebene Bedingung erfüllt ist, andernfalls gibt sie falsch zurück. Die folgenden sind die häufig verwendeten stringbasierten bedingten Operatoren:
| Operator | Beschreibung |
| == | Gibt wahr zurück, wenn die Zeichenfolgen gleich sind |
| != | Gibt wahr zurück, wenn die Zeichenfolgen nicht gleich sind |
| -n | Gibt wahr zurück, wenn die zu testende Zeichenfolge nicht null ist |
| -z | Gibt wahr zurück, wenn die zu testende Zeichenfolge null ist |
Lass uns ein Beispielskript erstellen, das eine stringbasierte bedingte Anweisung verwendet. Das Skript ermöglicht es dem Benutzer, zwei Zeichenfolgen einzugeben und zu überprüfen, ob eine der Zeichenfolgen null ist, ob beide Zeichenfolgen gleich oder ungleich sind.
#!/bin/bash
read -p "Erste Zeichenfolge: " str1
read -p "Zweite Zeichenfolge: " str2
if [ -z "$str1" ]
then
echo "Die 1. Zeichenfolge ist null"
elif [ -z "$str2" ]
then
echo "Die 2. Zeichenfolge ist null"
else
if [ $str1 == $str2 ]
then
echo "Die Zeichenfolgen sind gleich"
else
echo "Die Zeichenfolgen sind nicht gleich"
fi
fi
Arithmetisch-basierte Bedingung
Die Shell bietet mehrere Möglichkeiten, eine arithmetisch-basierte Bedingung zu deklarieren. Zuerst ist es durch die Verwendung von Mnemoniken, die zusammen mit der alten Einzelklammer-Syntax verwendet werden können, und die andere ist die Verwendung von mathematisch freundlichen Symbolen, die zusammen mit der doppelten Klammer verwendet werden können.
Unten ist die Liste der verfügbaren Mnemoniken für arithmetisch-basierte bedingte Anweisungen in der Shell:
| Operator | Verwendung/Beschreibung |
| -eq | Gleich |
| -ge | Größer als oder gleich |
| -gt | Größer als |
| -le | Kleiner als oder gleich |
| -lt | Kleiner als |
| -ne | Nicht gleich |
Lass uns ein Skript erstellen, das eine ganze Zahl vom Benutzer akzeptiert und bestimmt, ob die ganze Zahl null, negativ, ungerade oder eine gerade Zahl ist.
#!/bin/bash
read -p "Geben Sie eine ganze Zahl ein: " int1
if [ $int1 -eq 0 ]
then
echo "Null"
elif [ $int1 -lt 0 ]
then
echo "Negativ"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Gerade"
else
echo "Ungerade"
fi
fi
Arithmetischer Operator für die doppelte Klammer-Syntax:
| Operator | Verwendung/Beschreibung |
| == | Gleich |
| >= | Größer als oder gleich |
| > | Größer als |
| <= | Kleiner als oder gleich |
| < | Kleiner als |
| != | Nicht gleich |
Jetzt lass uns unser vorheriges Skript umstrukturieren und die doppelte Klammer-Syntax verwenden:
#!/bin/bash
read -p "Geben Sie eine ganze Zahl ein: " int1
if (( $int1 == 0 ))
then
echo "Null"
elif (( $int1 < 0 ))
then
echo "Negativ"
else
if (( $((int1%2)) == 0 ))
then
echo "Gerade"
else
echo "Ungerade"
fi
fi
Switch-Anweisung
Die Switch-Anweisung ist eine andere Art von bedingter Anweisung im Shell-Skripting. Sie ermöglicht es einem Programmierer, mehrere Werte mit einer Variablen zu vergleichen, was einfacher ist als die if-bedingte Anweisung. Die Syntax für die Switch-Anweisung lautet:
case in
)
##Reihe von Code für pattern1
;;
)
##Reihe von Code für pattern2
;;
)
##Reihe von Code für patternN
;;
*)
##Standardanweisungen
esac
Das Muster ist der mögliche Wert der Variablen. Jedes Muster ist durch ein doppeltes Semikolon getrennt, das als Break-Anweisung des Musters dient. Die Switch-Anweisung wird mit einer esac-Anweisung geschlossen.
#!/bin/bash
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menü: \n[a] Addition\n[b]Subtraktion\n[c]Multiplikation\n[d]Division\n"
echo "======================"
read -p "Ihre Wahl: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Ungültige Eingabe"
esac
echo "Das Ergebnis ist: " $res
Fazit
Die Bash-Shell bietet viele nützliche Werkzeuge für Programmierer. Wie die meisten Programmiersprachen heute ist sie auch in der Lage, bedingte Entscheidungen zu treffen, die Shell-Skripte interaktiver und intelligenter machen. In der nächsten Serie werden wir die wiederholenden Steuerstrukturen behandeln. Bis zum nächsten Mal.
Referenzen
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
- https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
Die nächste Lektion: Wiederholungssteuerungsstrukturen
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.