Bedingte Anweisungen in der Shell

LinuxBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie bedingte Anweisungen in der Shell-Programmierung einsetzen, um logische Entscheidungen innerhalb Ihrer Skripte zu treffen. Wir behandeln die grundlegende Syntax von if-else-Anweisungen sowie die Verwendung von numerischen Vergleichen und String-Vergleichen zur Auswertung von Bedingungen. Am Ende dieses Labs werden Sie in der Lage sein, Shell-Skripte zu schreiben, die flexibel auf unterschiedliche Situationen reagieren können.

Erstellen Sie Ihre erste If-Anweisung

Beginnen wir mit einer einfachen if-Anweisung, die prüft, ob eine Variable namens NAME den Wert "John" hat.

Öffnen Sie zunächst ein Terminal in der WebIDE. Standardmäßig sollten Sie sich im Verzeichnis /home/labex/project befinden. Wenn Sie unsicher sind, können Sie Ihr aktuelles Verzeichnis jederzeit mit dem Befehl pwd überprüfen.

Erstellen Sie eine neue Datei namens if.sh mit dem folgenden Befehl:

touch if.sh

Dieser Befehl erzeugt eine leere Datei mit dem Namen if.sh in Ihrem aktuellen Verzeichnis.

Öffnen Sie nun die Datei if.sh in der WebIDE. Klicken Sie dazu einfach auf die Datei im Datei-Explorer auf der linken Seite.

Fügen Sie der Datei den folgenden Inhalt hinzu:

#!/bin/bash

NAME="John"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
fi

Lassen Sie uns dieses Skript analysieren:

  1. #!/bin/bash: Dies ist die sogenannte "Shebang"-Zeile. Sie teilt dem System mit, welcher Interpreter zum Ausführen des Skripts verwendet werden soll. In diesem Fall nutzen wir Bash.
  2. NAME="John": Diese Zeile erstellt eine Variable namens NAME und weist ihr den Wert "John" zu.
  3. if [ "$NAME" = "John" ]; then: Dies ist der Beginn unserer if-Anweisung. Sie prüft, ob der Wert von NAME gleich "John" ist.
    • Die eckigen Klammern [ ] sind in der Bash tatsächlich ein Befehl, der äquivalent zum test-Befehl ist.
    • Wir setzen "$NAME" in Anführungszeichen, um Fehler zu vermeiden, falls NAME leer sein sollte oder Leerzeichen enthält.
    • Das Semikolon und das Schlüsselwort then gehören zur Syntax der if-Anweisung in der Bash.
  4. echo "The name is John": Diese Zeile wird nur ausgeführt, wenn die Bedingung wahr (true) ist.
  5. fi: Dies markiert das Ende der if-Anweisung. Es ist einfach "if" rückwärts geschrieben!

Speichern Sie die Datei, nachdem Sie den Inhalt hinzugefügt haben.

Jetzt müssen wir das Skript ausführbar machen. In Unix-ähnlichen Systemen sind Dateien aus Sicherheitsgründen standardmäßig nicht ausführbar. Dies können wir mit dem Befehl chmod ändern:

chmod +x if.sh

Dieser Befehl fügt der Datei die Ausführungsberechtigung hinzu. Das +x steht für "execute" (ausführen).

Führen Sie das Skript nun aus:

./if.sh

Das ./ weist die Shell an, im aktuellen Verzeichnis nach dem Skript zu suchen.

Sie sollten die folgende Ausgabe sehen: The name is John

Falls Sie diese Ausgabe nicht sehen, prüfen Sie bitte erneut, ob Sie die Datei mit dem korrekten Inhalt gespeichert und sie wirklich ausführbar gemacht haben.

Eine Else-Klausel hinzufügen

Erweitern wir nun unsere if-Anweisung um eine else-Klausel. Damit können wir festlegen, was passieren soll, wenn die Bedingung falsch (false) ist.

Öffnen Sie die Datei if.sh erneut in der WebIDE und ändern Sie den Inhalt wie folgt:

#!/bin/bash

NAME="Alice"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
else
  echo "The name is not John"
fi

Hier sind die Änderungen im Detail:

  1. Wir haben die Variable NAME auf "Alice" geändert. So können wir demonstrieren, was passiert, wenn die Bedingung nicht erfüllt ist.
  2. Wir haben eine else-Klausel hinzugefügt. Diese definiert den Alternativpfad, falls die Bedingung in der if-Anweisung unwahr ist.
  3. Nach dem else haben wir einen weiteren echo-Befehl eingefügt, der ausgeführt wird, wenn NAME nicht "John" ist.

Die else-Klausel ist optional, aber sehr nützlich, wenn Sie eine bestimmte Aktion ausführen möchten, anstatt das Skript einfach ohne Rückmeldung weiterlaufen zu lassen.

Speichern Sie die Datei mit diesen Änderungen.

Führen Sie das Skript erneut aus:

./if.sh

Diesmal sollten Sie die Ausgabe sehen: The name is not John

Da NAME jetzt "Alice" ist, ist die Bedingung [ "$NAME" = "John" ] falsch, und der Code im else-Block wird ausgeführt.

Versuchen Sie, die Variable NAME wieder in "John" zu ändern und das Skript erneut zu starten. Welche Ausgabe erhalten Sie? Dies ist ein guter Weg, um sicherzustellen, dass Ihre if-else-Struktur für beide Fälle korrekt funktioniert.

Einführung von Elif

Manchmal müssen wir mehr als zwei Möglichkeiten prüfen. Hier kommt die elif-Klausel (kurz für "else if") ins Spiel. Wir passen unser Skript an, um verschiedene Namen zu erkennen.

Aktualisieren Sie die Datei if.sh mit folgendem Inhalt:

#!/bin/bash

NAME="George"
if [ "$NAME" = "John" ]; then
  echo "John Lennon"
elif [ "$NAME" = "Paul" ]; then
  echo "Paul McCartney"
elif [ "$NAME" = "George" ]; then
  echo "George Harrison"
elif [ "$NAME" = "Ringo" ]; then
  echo "Ringo Starr"
else
  echo "Unknown member"
fi

Lassen Sie uns den Ablauf durchgehen:

  1. Wir beginnen mit NAME="George".
  2. Die erste if-Anweisung prüft, ob der Name "John" ist.
  3. Wenn es nicht "John" ist, springt das Skript zur ersten elif-Anweisung und prüft auf "Paul".
  4. Ist es nicht "Paul", geht es weiter zum nächsten elif für "George".
  5. Wenn auch das nicht zutrifft, wird auf "Ringo" geprüft.
  6. Wenn keine dieser Bedingungen wahr ist, greift die abschließende else-Klausel und gibt "Unknown member" aus.

Mit elif können Sie beliebig viele Bedingungen nacheinander prüfen. Die Bedingungen werden der Reihe nach ausgewertet, und nur der Codeblock der ersten zutreffenden Bedingung wird ausgeführt.

Speichern Sie die Datei.

Führen Sie das Skript aus:

./if.sh

Sie sollten die Ausgabe sehen: George Harrison

Experimentieren Sie mit der Variable NAME, indem Sie sie auf "John", "Paul", "Ringo" oder etwas völlig anderes setzen, und beobachten Sie, wie sich die Ausgabe jeweils anpasst.

Numerische Vergleiche

Shell-Skripte können auch Zahlen vergleichen. Erstellen wir ein neues Skript, um dies zu demonstrieren.

Erstellen Sie eine neue Datei namens numeric.sh:

touch numeric.sh

Öffnen Sie numeric.sh in der WebIDE und fügen Sie den folgenden Inhalt hinzu:

#!/bin/bash

NUMBER=10

if [ $NUMBER -lt 5 ]; then
  echo "The number is less than 5"
elif [ $NUMBER -eq 10 ]; then
  echo "The number is exactly 10"
elif [ $NUMBER -gt 15 ]; then
  echo "The number is greater than 15"
else
  echo "The number is between 5 and 15, but not 10"
fi

Dieses Skript führt numerische Vergleichsoperatoren ein:

  • -lt: kleiner als (less than)
  • -eq: gleich (equal to)
  • -gt: größer als (greater than)

Es gibt noch weitere Operatoren:

  • -le: kleiner oder gleich (less than or equal to)
  • -ge: größer oder gleich (greater than or equal to)
  • -ne: ungleich (not equal to)

Beachten Sie, dass wir diese speziellen Kürzel anstelle von Symbolen wie < oder > verwenden. Das liegt daran, dass in der Bash < und > für die Ein-/Ausgabeumleitung reserviert sind und nicht für den numerischen Vergleich innerhalb von einfachen eckigen Klammern genutzt werden.

Machen Sie das Skript ausführbar und starten Sie es:

chmod +x numeric.sh
./numeric.sh

Sie sollten die Ausgabe sehen: The number is exactly 10

Ändern Sie den Wert von NUMBER testweise auf 20 (Ergebnis: "greater than 15") oder auf 7 (Ergebnis: "between 5 and 15, but not 10"), um die Logik zu prüfen.

String-Vergleiche und logische Operatoren

Zum Abschluss schauen wir uns String-Vergleiche und logische Verknüpfungen an. Erstellen Sie eine Datei namens string_logic.sh:

touch string_logic.sh

Öffnen Sie string_logic.sh in der WebIDE und fügen Sie diesen Inhalt ein:

#!/bin/bash

STRING1="hello"
STRING2="world"
NUMBER1=5
NUMBER2=10

if [ "$STRING1" = "hello" ] && [ "$STRING2" = "world" ]; then
  echo "Both strings match"
fi

if [ $NUMBER1 -lt 10 ] || [ $NUMBER2 -gt 5 ]; then
  echo "At least one of the number conditions is true"
fi

if [[ "$STRING1" != "$STRING2" ]]; then
  echo "The strings are different"
fi

if [[ -z "$STRING3" ]]; then
  echo "STRING3 is empty or not set"
fi

Dieses Skript zeigt mehrere neue Konzepte:

  1. String-Gleichheit (=): Prüft, ob zwei Zeichenketten identisch sind.
  2. Logisches UND (&&): Verknüpft zwei Bedingungen. Beide müssen wahr sein, damit der gesamte Ausdruck wahr ist.
  3. Logisches ODER (||): Verknüpft zwei Bedingungen. Es reicht aus, wenn eine davon wahr ist.
  4. String-Ungleichheit (!=): Prüft, ob zwei Zeichenketten unterschiedlich sind.
  5. Prüfung auf leere Strings (-z): Ist wahr, wenn der String leer ist (Länge Null).

Beachten Sie auch die Verwendung von doppelten eckigen Klammern [[ ]]. Dies ist eine erweiterte Version der einfachen Klammern und wird in modernen Bash-Skripten bevorzugt. Sie sind robuster gegenüber Fehlern bei Leerzeichen oder leeren Variablen.

Machen Sie das Skript ausführbar und führen Sie es aus:

chmod +x string_logic.sh
./string_logic.sh

Sie sollten alle vier Nachrichten sehen, da alle Bedingungen im Skript so gewählt sind, dass sie zutreffen.

Both strings match
At least one of the number conditions is true
The strings are different
STRING3 is empty or not set

Versuchen Sie, Werte zu ändern (z. B. STRING1 auf etwas anderes als "hello"), um zu sehen, wie sich die Ausgabe verringert.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man bedingte Anweisungen in der Shell-Programmierung verwendet. Sie haben den Einsatz von if-else-Anweisungen, elif-Klauseln, numerischen Vergleichen, String-Vergleichen und logischen Operatoren geübt. Diese Werkzeuge sind die Grundlage für die Erstellung intelligenter und entscheidungsfähiger Shell-Skripte.

Wichtige Erkenntnisse:

  • Die Grundstruktur von if-else-Anweisungen in Shell-Skripten.
  • Die Verwendung von elif für multiple Fallunterscheidungen.
  • Numerische Vergleichsoperatoren wie -lt, -gt, -eq.
  • String-Vergleiche und die logischen Verknüpfungen && und ||.
  • Die Notwendigkeit, Skripte mit chmod ausführbar zu machen.

Denken Sie daran: Übung ist der Schlüssel zur Meisterschaft im Shell-Scripting. Versuchen Sie, eigene Skripte zu entwerfen, die diese Konzepte kombinieren. Mit der Zeit werden Ihnen diese bedingten Anweisungen helfen, immer komplexere und nützlichere Automatisierungen zu erstellen.