TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

Bedingte Anweisungen in Bash: if, elif, else

December 7, 2015

Bedingte Anweisungen sind ein fundamentaler Bestandteil jeder Programmiersprache. In Bash ermöglichen sie es, Code nur dann auszuführen, wenn bestimmte Bedingungen erfüllt sind. Die grundlegende Struktur hierfür ist der if-Block.


1. Grundlegende if-else-Struktur

Ein if-Block wird mit if eingeleitet und mit fi (umgekehrtes if) beendet.

code
#!/usr/bin/env bash

read -r -p "Geben Sie eine Zahl ein: " number

if [ "$number" -gt 10 ]; then
  echo "Die Zahl ist größer als 10."
else
  echo "Die Zahl ist 10 oder kleiner."
fi

Wichtig: Die Leerzeichen um die eckigen Klammern [ und ] sind syntaktisch erforderlich. [ ist tatsächlich ein Alias für den test-Befehl.


2. Verschachtelung mit elif

elif (else if) ermöglicht die Prüfung mehrerer, aufeinanderfolgender Bedingungen.

code
#!/usr/bin/env bash

read -r -p "Geben Sie einen Domainnamen ein: " domain

if [ "$domain" = "google.com" ]; then
  echo "Suche bei Google..."
elif [ "$domain" = "github.com" ]; then
  echo "Öffne GitHub..."
else
  echo "Pinge die Domain: $domain"
  ping -c 3 "$domain"
fi

3. [ vs. [[ ... ]] (Test vs. erweiterter Test)

Bash bietet zwei Arten von Test-Konstrukten:

  • [ ... ] (oder test): Dies ist der ursprüngliche, POSIX-konforme Befehl. Er ist auf allen Bourne-kompatiblen Shells verfügbar.
  • [[ ... ]]: Dies ist eine erweiterte Bash-spezifische Syntax, die robuster und benutzerfreundlicher ist. Sie wird für Bash-Skripte empfohlen.

Vorteile von [[ ... ]]:

  • Kein Word Splitting oder Globbing: Variablen müssen nicht immer in Anführungszeichen gesetzt werden (obwohl es weiterhin eine gute Praxis ist).
  • Reguläre Ausdrücke: Unterstützt den =~-Operator für den Abgleich mit regulären Ausdrücken.
  • Klarere logische Operatoren: Verwendet && und || anstelle von -a und -o.

Beispiel:

code
# Mit [[ ... ]]
name="John Doe"
if [[ $name == "John"* ]]; then
  echo "Der Name beginnt mit John."
fi

4. Wichtige Vergleichsoperatoren

String-Vergleiche (innerhalb von [[ ... ]])

OperatorBeschreibung
==Gleich
!=Ungleich
-z strLeer (zero length)
-n strNicht leer
<Kleiner als (alphabetisch)
>Größer als (alphabetisch)

Numerische Vergleiche

OperatorBeschreibung
-eqGleich (equal)
-neUngleich (not equal)
-gtGrößer als (greater than)
-geGrößer oder gleich (greater or equal)
-ltKleiner als (less than)
-leKleiner oder gleich (less or equal)

Datei-Operatoren

Siehe separaten Guide zu File Test Operatoren.


5. Kurzschreibweise mit && und ||

Die logischen Operatoren && (UND) und || (ODER) können verwendet werden, um Befehle basierend auf dem Erfolg (Exit-Code 0) des vorherigen Befehls auszuführen.

code
# Führe 'echo "Existiert"' nur aus, wenn die Datei existiert.
[ -f "config.txt" ] && echo "Datei 'config.txt' existiert."

# Führe 'echo "Fehlt"' nur aus, wenn der erste Befehl fehlschlägt.
[ -f "config.txt" ] || echo "Datei 'config.txt' fehlt."

Diese Schreibweise ist nützlich für einfache, einzeilige Bedingungen.


Fazit

Bedingte Anweisungen sind das Rückgrat der Logik in Bash-Skripten. Für neue Skripte, die ausschließlich für Bash geschrieben werden, ist die Verwendung der erweiterten [[ ... ]]-Syntax aufgrund ihrer Robustheit und besseren Lesbarkeit zu bevorzugen.