Bedingte Anweisungen in der Shell

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie bedingte Anweisungen in der Shell-Programmierung verwenden, um logische Entscheidungen zu treffen. Wir werden die grundlegende Syntax von if-else-Anweisungen behandeln, sowie wie Sie numerische und Zeichenkettenvergleiche verwenden, um Bedingungen zu evaluieren. Am Ende dieses Labs können Sie Shell-Skripte schreiben, die Entscheidungen auf der Grundlage verschiedener Bedingungen treffen können.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") linux/BasicSystemCommandsGroup -.-> linux/logical("Logic Operations") shell/VariableHandlingGroup -.-> shell/variables_decl("Variable Declaration") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") subgraph Lab Skills linux/echo -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} shell/shebang -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} shell/comments -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} linux/logical -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} shell/variables_decl -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} shell/variables_usage -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} linux/chmod -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} linux/cd -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} shell/if_else -.-> lab-388815{{"Bedingte Anweisungen in der Shell"}} end

Erstellen Sie Ihre erste If-Anweisung

Beginnen wir damit, eine einfache If-Anweisung zu erstellen, die prüft, ob eine Variable namens NAME gleich "John" ist.

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

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

touch if.sh

Dieser Befehl erstellt eine leere Datei namens if.sh in Ihrem aktuellen Verzeichnis.

Öffnen Sie jetzt die Datei if.sh in der WebIDE. Sie können dies tun, indem Sie auf die Datei im Dateiexplorer auf der linken Seite der WebIDE klicken.

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 wird als "Shebang"-Zeile bezeichnet. Sie teilt dem System mit, welchen Interpreter es verwenden soll, um das Skript auszuführen. In diesem Fall verwenden 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 Bash eigentlich ein Befehl, der dem test-Befehl entspricht.
    • Wir setzen "$NAME" in Anführungszeichen, um Fälle zu behandeln, in denen NAME leer sein oder Leerzeichen enthalten könnte.
    • Das Semikolon und then sind Teil der Syntax der If-Anweisung in Bash.
  4. echo "The name is John": Diese Zeile wird ausgeführt, wenn die Bedingung wahr ist.
  5. fi: Dies markiert das Ende der If-Anweisung. Es ist "if" rückwärts geschrieben!

Speichern Sie die Datei nach dem Hinzufügen dieses Inhalts.

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

chmod +x if.sh

Dieser Befehl fügt der Datei die Ausführungsberechtigung hinzu. Das +x bedeutet "Füge Ausführungsberechtigung hinzu".

Führen Sie jetzt das Skript aus:

./if.sh

Das ./ teilt der Shell mit, im aktuellen Verzeichnis nach dem Skript zu suchen.

Sie sollten die Ausgabe sehen: The name is John

Wenn Sie diese Ausgabe nicht sehen, überprüfen Sie noch einmal, ob Sie die Datei mit dem richtigen Inhalt gespeichert haben und ob Sie sie ausführbar gemacht haben.

Hinzufügen einer Else-Klausel

Jetzt erweitern wir unsere If-Anweisung um eine Else-Klausel. Dies ermöglicht es uns, anzugeben, was passieren soll, wenn die Bedingung falsch ist.

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

#!/bin/bash

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

Lassen Sie uns die Änderungen durchgehen:

  1. Wir haben die Variable NAME in "Alice" geändert. Dies dient dazu, zu demonstrieren, was passiert, wenn die Bedingung falsch ist.
  2. Wir haben eine else-Klausel hinzugefügt. Diese Klausel gibt an, was passieren soll, wenn die Bedingung in der If-Anweisung falsch ist.
  3. Nach dem else haben wir einen weiteren echo-Befehl hinzugefügt, der ausgeführt wird, wenn NAME nicht "John" ist.

Die else-Klausel ist in If-Anweisungen optional, aber sehr nützlich, wenn Sie etwas bestimmtes tun möchten, wenn die Bedingung falsch ist, anstatt einfach nichts zu tun.

Speichern Sie die Datei mit diesen Änderungen.

Führen Sie jetzt das Skript erneut aus:

./if.sh

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

Das liegt daran, dass NAME jetzt "Alice" ist, also 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 auszuführen. Welche Ausgabe erhalten Sie? Dies ist eine gute Möglichkeit, zu testen, ob Ihre If-Else-Anweisung für beide Fälle korrekt funktioniert.

Einführung von Elif

Manchmal möchten wir mehrere Bedingungen prüfen. Hier kommt die elif- (else if) Klausel ins Spiel. Lassen Sie uns unser Skript ändern, um mehrere Namen zu verarbeiten.

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 dieses Skript analysieren:

  1. Wir beginnen mit NAME="George". Dies ist der Name, den wir prüfen.
  2. Die erste if-Anweisung prüft, ob der Name "John" ist.
  3. Wenn es nicht "John" ist, gehen wir zur ersten elif- (else if) Anweisung über, die prüft, ob der Name "Paul" ist.
  4. Wenn es nicht "Paul" ist, gehen wir zur nächsten elif-Anweisung über und prüfen auf "George".
  5. Wenn es nicht "George" ist, prüfen wir auf "Ringo".
  6. Wenn keine dieser Bedingungen wahr ist, gelangen wir zur else-Klausel, die "Unknown member" ausgibt.

Die elif-Klausel ermöglicht es Ihnen, mehrere Bedingungen nacheinander zu prüfen. Sie können so viele elif-Klauseln haben, wie Sie benötigen. Die Bedingungen werden in der Reihenfolge geprüft, und die erste, die wahr ist, führt ihren entsprechenden Codeblock aus.

Speichern Sie die Datei mit diesen Änderungen.

Führen Sie jetzt das Skript aus:

./if.sh

Sie sollten die Ausgabe sehen: George Harrison

Versuchen Sie, die Variable NAME auf verschiedene Werte ("John", "Paul", "Ringo" oder etwas völlig anderes) zu ändern und das Skript jedes Mal auszuführen. Beobachten Sie, wie sich die Ausgabe basierend auf dem Wert von NAME ändert.

Numerische Vergleiche

Shell-Skripte können auch Zahlen vergleichen. Lassen Sie uns ein neues Skript erstellen, um numerische Vergleiche zu demonstrieren.

Erstellen Sie eine neue Datei namens numeric.sh:

touch numeric.sh

Öffnen Sie numeric.sh in der WebIDE und fügen Sie 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 stellt numerische Vergleichsoperatoren vor:

  • -lt: kleiner als
  • -eq: gleich
  • -gt: größer als

Es gibt auch andere, die Sie verwenden können:

  • -le: kleiner oder gleich
  • -ge: größer oder gleich
  • -ne: ungleich

Beachten Sie, dass wir diese speziellen Operatoren anstelle von Symbolen wie < oder > verwenden. Dies liegt daran, dass in Bash < und > für die Ein- / Ausgabeumleitung verwendet werden, nicht für numerische Vergleiche.

Jetzt machen wir das Skript ausführbar und führen es aus:

chmod +x numeric.sh
./numeric.sh

Sie sollten die Ausgabe sehen: The number is exactly 10

Versuchen Sie, die Variable NUMBER auf verschiedene Werte zu ändern und das Skript erneut auszuführen. Beobachten Sie, wie sich die Ausgabe basierend auf dem von Ihnen festgelegten Wert ändert.

Beispielsweise sollten Sie, wenn Sie NUMBER auf 20 ändern, "The number is greater than 15" erhalten. Wenn Sie es auf 7 ändern, sollten Sie "The number is between 5 and 15, but not 10" erhalten.

String-Vergleiche und logische Operatoren

Abschließend wollen wir uns String-Vergleiche und logische Operatoren anschauen. Erstellen Sie eine neue Datei namens string_logic.sh:

touch string_logic.sh

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

#!/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 demonstriert mehrere neue Konzepte:

  1. String-Gleichheitsvergleich (=): Dieser prüft, ob zwei Strings genau gleich sind.
  2. Logisches UND (&&): Dieser Operator ermöglicht es Ihnen, zwei Bedingungen zu kombinieren. Beide Bedingungen müssen wahr sein, damit der gesamte Ausdruck wahr ist.
  3. Logisches ODER (||): Dieser Operator kombiniert ebenfalls zwei Bedingungen, aber nur eine muss wahr sein, damit der gesamte Ausdruck wahr ist.
  4. String-Ungleichheitsvergleich (!=): Dieser prüft, ob zwei Strings unterschiedlich sind.
  5. Prüfen, ob ein String leer ist (-z): Dies ist wahr, wenn der String leer ist (Länge null).

Beachten Sie auch die Verwendung von doppelten eckigen Klammern [[ ]] in einigen der If-Anweisungen. Dies ist eine verbesserte Version der einfachen eckigen Klammern und wird in Bash-Skripten möglichst bevorzugt. Sie ermöglichen komplexere Ausdrücke und haben weniger Überraschungen in Bezug auf Wortaufteilung und Pfadnamenexpansion.

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

chmod +x string_logic.sh
./string_logic.sh

Sie sollten alle vier echo-Anweisungen sehen, da alle Bedingungen im Skript wahr sind.

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

Versuchen Sie, einige der Werte zu ändern (z. B. STRING1 auf etwas anderes als "hello" setzen) und sehen Sie, wie sich dies auf die Ausgabe auswirkt.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie bedingte Anweisungen in der Shell-Programmierung verwenden. Sie haben das Verwenden von If-Else-Anweisungen, Elif-Klauseln, numerischen Vergleichen, String-Vergleichen und logischen Operatoren geübt. Mit diesen Werkzeugen können Sie komplexere und auf Entscheidungen basierende Shell-Skripte erstellen.

Wichtige Erkenntnisse:

  • Die Grundstruktur von If-Else-Anweisungen in Shell-Skripten
  • Wie man Elif für mehrere Bedingungen verwendet
  • Numerische Vergleichsoperatoren (-lt, -gt, -eq, etc.)
  • String-Vergleiche und logische Operatoren
  • Die Wichtigkeit, Skripte mit chmod ausführbar zu machen

Denken Sie daran, dass Übung der Schlüssel zur Meisterschaft in der Shell-Skripting ist. Versuchen Sie, Ihre eigenen Skripte zu erstellen, die diese Konzepte auf verschiedene Weise nutzen. Wenn Sie fortschreiten, werden Sie feststellen, dass diese bedingten Anweisungen unerlässlich sind, um raffiniertere und nützlichere Skripte zu erstellen.