If: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „= 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ühr…“)
 
Zeile 1: Zeile 1:
= if-Verzweigungen =
+
== if-Verzweigungen ==
  
*Die if-Struktur ist die zentrale Möglichkeit, in Bash bedingte Abläufe zu steuern.
+
*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.*
+
*Sie ermöglicht es, Befehle nur dann auszuführen, wenn eine bestimmte Bedingung erfüllt ist.
  
 
== Grundprinzip ==
 
== Grundprinzip ==
*Die Bash prüft den **Exit-Status** eines Kommandos oder Tests:
+
*Die Bash prüft den **Exit-Status** eines Kommandos oder Tests:
   0 bedeutet **wahr**, jeder andere Wert bedeutet **falsch**.
+
   0 bedeutet **wahr**, jeder andere Wert bedeutet **falsch**.
*Entsprechend werden die zugehörigen Befehle im then- oder else-Zweig ausgeführt.*
+
*Entsprechend werden die zugehörigen Befehle im then- oder else-Zweig ausgeführt.
  
 
== Syntax ==
 
== Syntax ==
 +
if [ Bedingung ]; then
 +
  Befehle bei wahr
 +
fi
 +
 +
;if mit else
 
  if [ Bedingung ]; then
 
  if [ Bedingung ]; then
 
   Befehle bei wahr
 
   Befehle bei wahr
Zeile 27: Zeile 32:
 
== Beispiele ==
 
== Beispiele ==
  
;Einfaches Beispiel
+
;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
 
  if [ -f /etc/passwd ]; then
 
   echo "Datei existiert"
 
   echo "Datei existiert"
Zeile 34: Zeile 47:
 
  fi
 
  fi
  
  Ausgabe:
+
  Ausgabe:
   Datei existiert
+
   Datei existiert
  
 
;Beispiel mit Benutzerabfrage
 
;Beispiel mit Benutzerabfrage
Zeile 45: Zeile 58:
 
  fi
 
  fi
  
  Ausgabe:
+
  Ausgabe:
   Normaler Benutzer
+
   Normaler Benutzer
  
 
;Beispiel mit elif
 
;Beispiel mit elif
Zeile 60: Zeile 73:
  
 
== Überprüfung des Rückgabewerts ==
 
== Überprüfung des Rückgabewerts ==
*Der letzte ausgeführte Test oder Befehl liefert einen Rückgabewert, der mit '''echo $?''' angezeigt werden kann.
+
*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“.*
+
*Ein Exit-Status von 0 bedeutet „Bedingung erfüllt“, ein anderer Wert „Bedingung nicht erfüllt“.
  
 
;Beispiel
 
;Beispiel
  [ -d /etc ]
+
  [ -d /etc ]
  echo $?
+
  echo $?
 
  0
 
  0
  
  [ -d /nichtda ]
+
  [ -d /nichtda ]
  echo $?
+
  echo $?
 
  1
 
  1
  
 
== Hinweise ==
 
== Hinweise ==
* Die Klammern [ ] sind ein Synonym für den Befehl '''test'''.
+
* Die Klammern [ ] sind ein Synonym für den Befehl '''test'''.
* Leerzeichen zwischen den eckigen Klammern und der Bedingung sind Pflicht.
+
* 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.
+
* 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 numerische Vergleiche werden Operatoren wie -eq, -lt, -gt usw. verwendet.
* Für Stringvergleiche werden = und != genutzt.
+
* Für Stringvergleiche werden = und != genutzt.
  
== Erweiterte Syntax mit [[ ... ]] ==
+
== Erweiterte Syntax mit <nowiki>[[ ... ]]</nowiki> ==
*Die doppelten Klammern [[ ... ]] sind eine modernere Variante mit erweiterten Vergleichsmöglichkeiten.
+
*Die doppelten Klammern <nowiki>[[ ... ]]</nowiki> sind eine modernere Variante mit erweiterten Vergleichsmöglichkeiten.
*Sie unterstützen z. B. Mustervergleiche (Globbing) und logische Operatoren ohne Maskierung.*
+
*Sie unterstützen z. B. Mustervergleiche (Globbing) und logische Operatoren ohne Maskierung.
  
 
;Beispiel
 
;Beispiel
 
  NAME="Thomas"
 
  NAME="Thomas"
  if [[ $NAME == Th* ]]; then
+
  if <nowiki>[[</nowiki> $NAME == Th* <nowiki>]]</nowiki>; then
 
   echo "Name beginnt mit Th"
 
   echo "Name beginnt mit Th"
 
  fi
 
  fi
  
 
== Typische Fehlerquellen ==
 
== Typische Fehlerquellen ==
* Fehlende Leerzeichen nach [ oder vor ].
+
* Fehlende Leerzeichen nach [ oder vor ].
* Unbeabsichtigte Auswertung leerer Variablen → in Anführungszeichen setzen!
+
* Unbeabsichtigte Auswertung leerer Variablen → in Anführungszeichen setzen!
* Falsche Vergleichsoperatoren (z. B. = statt -eq bei Zahlen).
+
* Falsche Vergleichsoperatoren (z. B. = statt -eq bei Zahlen).
  
 
== Aufgaben ==
 
== Aufgaben ==
*Erstellen Sie ein Skript, das prüft, ob eine Datei '''/etc/passwd''' existiert, und eine passende Meldung ausgibt.
+
*Erstellen Sie ein Skript, das prüft, ob eine Datei '''/etc/passwd''' existiert, und eine passende Meldung ausgibt.
*Erstellen Sie ein Skript, das prüft, ob eine Variable '''NAME''' den Wert „root“ enthält, und entsprechende Ausgaben erzeugt.
+
*Erstellen Sie ein Skript, das prüft, ob eine Variable '''NAME''' den Wert „root“ enthält, und entsprechende Ausgaben erzeugt.
*Erweitern Sie die Abfrage mit '''elif''', sodass drei Zustände unterschieden werden (z. B. positiv, null, negativ).
+
*Erweitern Sie die Abfrage mit '''elif''', sodass drei Zustände unterschieden werden (z. B. positiv, null, negativ).
*Geben Sie bei jeder Bedingung den Rückgabewert mit '''echo $?''' aus.
+
*Geben Sie bei jeder Bedingung den Rückgabewert mit '''echo $?''' aus.
*Testen Sie die Unterschiede zwischen [ ... ] und [[ ... ]].*
+
*Testen Sie die Unterschiede zwischen [ ... ] und <nowiki>[[ ... ]]</nowiki>.

Version vom 24. November 2025, 17:46 Uhr

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

  • Erstellen Sie ein Skript, das prüft, ob eine Datei /etc/passwd existiert, und eine passende Meldung ausgibt.
  • Erstellen Sie ein Skript, das prüft, ob eine Variable NAME den Wert „root“ enthält, und entsprechende Ausgaben erzeugt.
  • Erweitern Sie die Abfrage mit elif, sodass drei Zustände unterschieden werden (z. B. positiv, null, negativ).
  • Geben Sie bei jeder Bedingung den Rückgabewert mit echo $? aus.
  • Testen Sie die Unterschiede zwischen [ ... ] und [[ ... ]].