If

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

if-Verzweigungen

  • Die if-Struktur ist die zentrale Möglichkeit, in Bash bedingte Abläufe zu steuern.
  • Sie ermöglicht es, Befehle nur dann auszuführen, wenn eine bestimmte Bedingung erfüllt ist.

Grundprinzip

  • Die Bash prüft den Exit-Status eines Kommandos oder Tests:
 0 bedeutet wahr, jeder andere Wert bedeutet falsch.
  • Entsprechend werden die zugehörigen Befehle im then- oder else-Zweig ausgeführt.

Syntax

if [ Bedingung ]; then
  Befehle bei wahr
fi
if mit else
if [ Bedingung ]; then
  Befehle bei wahr
else
  Befehle bei falsch
fi
Erweiterte Form mit elif
if [ Bedingung1 ]; then
  Befehle bei wahr
elif [ Bedingung2 ]; then
  Befehle bei zweiter Bedingung
else
  Befehle bei sonst
fi

Beispiele

Einfaches Beispiel ohne else
if [ -f /etc/passwd ]; then
  echo "Datei existiert"
fi
Ausgabe:
 Datei existiert
Einfaches Beispiel mit else
if [ -f /etc/passwd ]; then
  echo "Datei existiert"
else
  echo "Datei nicht gefunden"
fi
Ausgabe:
 Datei existiert
Beispiel mit Benutzerabfrage
NAME=$USER
if [ "$NAME" = "root" ]; then
  echo "Administrator erkannt"
else
  echo "Normaler Benutzer"
fi
Ausgabe:
 Normaler Benutzer
Beispiel mit elif
echo "Bitte Zahl eingeben:"
read ZAHL
if [ "$ZAHL" -lt 0 ]; then
  echo "Negativ"
elif [ "$ZAHL" -eq 0 ]; then
  echo "Null"
else
  echo "Positiv"
fi

Überprüfung des Rückgabewerts

  • Der letzte ausgeführte Test oder Befehl liefert einen Rückgabewert, der mit echo $? angezeigt werden kann.
  • Ein Exit-Status von 0 bedeutet „Bedingung erfüllt“, ein anderer Wert „Bedingung nicht erfüllt“.
Beispiel
[ -d /etc ]
echo $?
0
[ -d /nichtda ]
echo $?
1

Hinweise

  • Die Klammern [ ] sind ein Synonym für den Befehl test.
  • Leerzeichen zwischen den eckigen Klammern und der Bedingung sind Pflicht.
  • Es dürfen einfache oder doppelte Anführungszeichen verwendet werden, um Leerzeichen oder Sonderzeichen zu schützen.
  • Für numerische Vergleiche werden Operatoren wie -eq, -lt, -gt usw. verwendet.
  • Für Stringvergleiche werden = und != genutzt.

Erweiterte Syntax mit [[ ... ]]

  • Die doppelten Klammern [[ ... ]] sind eine modernere Variante mit erweiterten Vergleichsmöglichkeiten.
  • Sie unterstützen z. B. Mustervergleiche (Globbing) und logische Operatoren ohne Maskierung.
Beispiel
NAME="Thomas"
if [[ $NAME == Th* ]]; then
  echo "Name beginnt mit Th"
fi

Typische Fehlerquellen

  • Fehlende Leerzeichen nach [ oder vor ].
  • Unbeabsichtigte Auswertung leerer Variablen → in Anführungszeichen setzen!
  • Falsche Vergleichsoperatoren (z. B. = statt -eq bei Zahlen).

Aufgaben

Vorgabe

Um festzustellen ob ein Host online ist kann man ping nutzen.

  • ping -c 1 -w 1 1.1.1.1 > /dev/null
  • echo $?
0
  • ping -c 1 -w 1 1.1.2.1 > /dev/null
  • echo $?
1

Um festzustellen ob port auf einem Host geöffnet ist kann man netcat nutzen.

  • netcat -z 78.47.133.194 53 2> /dev/null
  • echo $?
0
  • netcat -z 78.47.133.194 51 2> /dev/null
  • echo $?
1

Aufgabe

  • Schreib ein Skript dem ihr eine Ip und Port übergibt.
  • Testet das 2 Argumente übergeben werden, ansonsten Fehlermeldung und Abruch
  • Schaut ob der Rechner online ist und gibt dies aus.
  • Wenn er Online ist test ihr ob der Port offen ist und gibt dies aus.