So verwenden Sie Case-Anweisungen in Bash-Skripten

0
390
Patpitchaya/Shutterstock.com

Bash-Case-Anweisungen sind leistungsstark und dennoch einfach zu schreiben. Wenn Sie ein altes Linux-Skript erneut besuchen, werden Sie froh sein, dass Sie anstelle einer langen if-then-else-Anweisung eine case-Anweisung verwendet haben.

Die case-Anweisung< /h2>

Die meisten Programmiersprachen haben ihre Version einer switch- oder case-Anweisung. Diese lenken den Ablauf der Programmausführung entsprechend dem Wert einer Variablen. Normalerweise ist für jeden der erwarteten möglichen Werte der Variablen ein Ausführungszweig und für alle anderen Werte ein Auffang- oder Standardzweig definiert.

Die logische Funktionalität ähnelt einer langen Abfolge von if -then-Anweisungen mit einer else-Anweisung, die alles abfängt, was zuvor nicht von einer der if-Anweisungen behandelt wurde.

RELATEDWas ist die Bash-Shell und warum ist sie so wichtig? zu Linux?

Die Bash-Implementierung von case versucht, einen Ausdruck mit einer der Klauseln abzugleichen. Es tut dies, indem es sich jede Klausel der Reihe nach ansieht und versucht, ein passendes Muster zu finden. Muster in Klauseln sind Zeichenfolgen, was jedoch nicht bedeutet, dass wir keine numerischen Werte als Ausdruck verwenden können.

Der generische Fall

Die generische Form der case-Anweisung ist diese:

case-Ausdruck in   Muster-1)   Anweisung   ;; Muster-2)   Anweisung   ;; . . . Muster-N)   Anweisung   ;; *) Stellungnahme ;; esac

  • Eine case-Anweisung muss mit dem Schlüsselwort case beginnen und mit dem Schlüsselwort esac enden.
  • Der Ausdruck wird ausgewertet und mit den Mustern in jeder Klausel verglichen, bis eine Übereinstimmung gefunden wird.
  • li>

  • Die Anweisung bzw. die Anweisungen in der Matching-Klausel werden ausgeführt.
  • Ein doppeltes Semikolon “;;” wird verwendet, um eine Klausel zu beenden.
  • Wenn ein Muster gefunden und die Anweisungen in dieser Klausel ausgeführt werden, werden alle anderen Muster ignoriert.
  • Die Anzahl der Klauseln ist unbegrenzt.
  • Ein Sternchen “*” bezeichnet das Standardmuster. Wenn ein Ausdruck mit keinem der anderen Muster in der case-Anweisung übereinstimmt, wird die Standardklausel ausgeführt.

Ein einfaches Beispiel

Dieses Skript sagt uns die Öffnungszeiten für einen imaginären Laden. Es verwendet den Datumsbefehl mit der Formatzeichenfolge +”%a”, um den verkürzten Tagesnamen zu erhalten. Dies wird in der Variablen DayName gespeichert.

#!/bin/bash DayName=$(date +”%a”) echo “Öffnungszeiten für $DayName” case $DayName in Mo) echo “09:00 – 17:30” ;; Di) echo “09:00 – 17:30” ;; Mi) echo “09:00 – 12:30” ;; Do) echo “09:00 – 17:30” ;; Fr) echo “09:00 – 16:00” ;; Sa) echo “09:30 – 16:00” ;; So) echo “Ganztägig geschlossen” ;; *) ;; esac-Werbung

Kopieren Sie diesen Text in einen Editor und speichern Sie ihn als Datei mit dem Namen “open.sh.”

Wir müssen den chmod verwenden Befehl, um es ausführbar zu machen. Sie müssen dies für alle Skripts tun, die Sie beim Durcharbeiten dieses Artikels erstellen.

chmod +x open.sh

Wir können jetzt unser Skript ausführen.

./open.sh

Der Tag, an dem der Screenshot erstellt wurde, ist zufällig ein Freitag. Das bedeutet, dass die Variable DayName die Zeichenfolge “Fr.” Dies wird mit der “Fr” Muster der “Fr)” -Klausel.

Beachten Sie, dass die Muster in den Klauseln nicht in doppelte Anführungszeichen gesetzt werden müssen, aber es schadet nicht, wenn sie es sind. Sie müssen jedoch doppelte Anführungszeichen verwenden, wenn das Muster Leerzeichen enthält.

Die Standardklausel wurde leer gelassen. Alles, was nicht mit einer der vorhergehenden Klauseln übereinstimmt, wird ignoriert.

Dieses Skript funktioniert und ist leicht zu lesen, aber es ist langatmig und wiederholt sich. Wir können diese Art von Groß-/Kleinschreibung ganz einfach kürzen.

VERWANDTE: So verwenden Sie den chmod-Befehl unter Linux

Mehrere Muster in einer Klausel verwenden

Eine wirklich nette Funktion von case-Anweisungen besteht darin, dass Sie in jeder Klausel mehrere Muster verwenden können. Wenn der Ausdruck mit einem dieser Muster übereinstimmt, werden die Anweisungen in dieser Klausel ausgeführt.

Werbung

Hier ist ein Skript, das Ihnen sagt, wie viele Tage ein Monat hat. Es kann nur drei Antworten geben: 30 Tage, 31 Tage oder 28 oder 29 Tage für Februar. Obwohl es 12 Monate gibt, brauchen wir also nur drei Klauseln.

In diesem Skript wird der Benutzer zur Eingabe des Monatsnamens aufgefordert. Damit beim Mustervergleich die Groß-/Kleinschreibung nicht beachtet wird, verwenden wir den Befehl shopt mit der Option -s nocasematch. Es spielt keine Rolle, ob die Eingabe Großbuchstaben, Kleinbuchstaben oder eine Mischung aus beiden enthält.

#!/bin/bash shopt -s nocasematch echo “Geben Sie den Monatsnamen ein” read month case $month in Februar) echo “28/29 Tage in $Monat” ;; April | Juni | September | November) echo “30 Tage in $Monat” ;; Januar | März | Mai | Juli | August | Oktober | Dezember) echo “31 Tage in $Monat” ;; *) echo “Unbekannter Monat: $Monat” ;; esac

Der Februar bekommt eine Klausel für sich selbst, und alle anderen Monate teilen sich zwei Klauseln, je nachdem, ob sie 30 oder 31 Tage haben. Klauseln mit mehreren Mustern verwenden das Pipe-Symbol “|” als Trennzeichen. Der Standardfall fängt falsch geschriebene Monate ab.

Wir haben dies in einer Datei namens “month.sh” gespeichert und sie ausführbar gemacht.

chmod +x month.sh

Wir führen das Skript mehrmals aus und zeigen, dass es egal ist, ob wir Groß- oder Kleinbuchstaben verwenden.

./month.sh

Werbung

Da wir das Skript angewiesen haben, Unterschiede in Groß- und Kleinschreibung zu ignorieren, wird jeder richtig geschriebene Monatsname von einem der drei Hauptsätze behandelt. Schlecht geschriebene Monate werden von der Standardklausel abgefangen.

Verwendung von Ziffern in Case-Anweisungen

Als Ausdruck können wir auch Ziffern oder numerische Variablen verwenden. Dieses Skript fordert den Benutzer auf, eine Zahl im Bereich 1…3 einzugeben. Um deutlich zu machen, dass die Muster in jeder Klausel Strings sind, wurden sie in doppelte Anführungszeichen gesetzt. Trotzdem ordnet das Skript die Eingaben des Benutzers immer noch der entsprechenden Klausel zu.

#!/bin/bash echo “Geben Sie 1, 2 oder 3 ein: ” lesen Sie den Zahlenkasten $Number in “1”) echo “Klausel 1 stimmte überein” ;; “2”) echo “Klausel 2 passt” ;; “3”) echo “Klausel 3 passt” ;; *) echo “Default-Klausel gefunden” ;; esac

Speichern Sie dies in einer Datei namens “number.sh”, machen Sie sie ausführbar und führen Sie sie dann aus:

./number.sh

Verwenden von case-Anweisungen in for-Schleifen

Eine case-Anweisung versucht, einen einzelnen Ausdruck nach Muster abzugleichen. Wenn Sie viele Ausdrücke verarbeiten müssen, können Sie die case-Anweisung in eine for-Schleife einfügen.

Dieses Skript führt den ls-Befehl aus, um eine Liste von Dateien zu erhalten. In der for-Schleife wird Dateiglobbing—ähnlich, aber anders als reguläre Ausdrücke—auf jede Datei angewendet, um die Dateierweiterung zu extrahieren. Dies wird in der String-Variablen der Erweiterung gespeichert.

Werbung

Die case-Anweisung verwendet die Extension-Variable als Ausdruck, den sie mit einer Klausel zu vergleichen versucht.

#!/bin/bash for File in $(ls) do # extrahiere die Dateierweiterung Extension=${File##*. } case “$Extension” in sh) echo ” Shell-Skript: $File” ;; md) echo ” Markdown-Datei: $Datei” ;; png) echo “PNG-Bilddatei: $Datei” ;; *) echo “Unbekannt: $Datei” ;; esac done

Speichern Sie diesen Text in einer Datei namens “filetype.sh”, machen Sie ihn ausführbar und führen Sie ihn dann aus mit:

./filetype.sh

Unser minimalistisches Skript zur Identifizierung des Dateityps funktioniert.

VERWANDT: So verwenden Sie “Here Documents” in Bash unter Linux

Umgang mit Exit-Codes mit case-Anweisungen

Ein gut erzogenes Programm sendet beim Beenden einen Exit-Code an die Shell. Das herkömmliche Schema verwendet einen Exit-Code-Wert von null, um eine problemlose Ausführung anzuzeigen, und Werte von eins oder mehr, um verschiedene Fehlertypen anzuzeigen.

Viele Programme verwenden nur null und eins. Die Zusammenfassung aller Fehlerbedingungen in einem einzigen Exit-Code erschwert die Identifizierung von Problemen, ist jedoch gängige Praxis.

RELATEDSo arbeiten Sie mit Variablen in Bash

Wir haben ein kleines Programm namens “go-geek” das würde nach dem Zufallsprinzip Exit-Codes von null oder eins zurückgeben. Dieses nächste Skript ruft go-geek auf. Es erwirbt den Exit-Code mit dem $? Shell-Variable und verwendet diese als Ausdruck für die case-Anweisung.

Ein reales Skript würde die entsprechende Verarbeitung entsprechend dem Erfolg oder Misserfolg des Befehls durchführen, der den Exit-Code generiert hat.

#! /bin/bash Go-Geek-Hülle $? in “0”) echo “Antwort war: Erfolg” echo “Hier entsprechende Verarbeitung durchführen” ;; “1”) echo “Antwort war: Fehler” echo “Hier entsprechende Fehlerbehandlung durchführen” ;; *) echo “Unerkannte Antwort: $?” ;; esac

Speichern Sie dies in einem Skript namens “return-code.sh” und ausführbar machen. Sie müssen unseren go-geek-Befehl durch einen anderen Befehl ersetzen. Sie könnten versuchen, in ein Verzeichnis zu cd zu gehen, das nicht existiert, um einen Exit-Code von Eins zu erhalten, und dann Ihr Skript bearbeiten, um in ein zugängliches Verzeichnis zu cd zu gelangen, um einen Exit-Code von Null zu erhalten.

Werbung

Wenn Sie das Skript einige Male ausführen, werden die verschiedenen Exit-Codes durch die case-Anweisung korrekt identifiziert.

./return-code.sh

Lesbarkeit hilft bei der Wartbarkeit

Going zurück zu alten Bash-Skripten und herauszufinden, wie sie tun, was sie tun, besonders wenn sie von jemand anderem geschrieben wurden, ist eine Herausforderung. Noch schwieriger ist es, die Funktionalität alter Skripte zu ändern.

Die case-Anweisung bietet Ihnen eine Verzweigungslogik mit klarer und einfacher Syntax. Das ist eine Win-Win-Situation.

VERWANDT: So installieren und verwenden Sie die Linux Bash Shell unter Windows 10

WEITER LESEN

  • › PSA: Betrüger nutzen Chip-Mangel, um Leute zu betrügen
  • › Beenden Sie das Schließen von Apps auf Ihrem Android-Telefon
  • › Kaufen Sie einen gebrauchten Mac oder ein MacBook? Überprüfen Sie diese Dinge, bevor Sie kaufen
  • › Was ist MIL-SPEC Fallschutz?
  • › 5 psychologische Tricks in kostenlosen Spielen (und wie man sie vermeidet)
  • › Windows 11 vs. Chrome OS: Welches ist das Beste für Android-Apps?