GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von Case-Anweisungen in Bash

Beim Schreiben von Bash-Skripten ist es üblich, einen String mit einer Variablen zu vergleichen und dann basierend auf dem, was angegeben wurde, etwas zu tun.

Betrachten Sie das folgende Skript. Es überprüft das erste Argument, das ein Benutzer angibt, und macht verschiedene Dinge, je nachdem, was angegeben wurde:

#!/usr/bin/env bash
if [[ "${1}" == "" ]]; then
	echo "No shape was specified."

elif [[ "${1}" == "square" ]]; then
	echo "You specified 'square'."

elif [[ "${1}" == "circle" ]]; then
	echo "You specified 'circle'."

elif [[ "${1}" == "triangle" ]]; then
	"You specified 'triangle'." 
    
else
	echo "Unknown shape '${1}'."
    exit 1

fi

Dies demonstriert, wenn auch ohne Funktionalität, eine einfache Aufgabe, die eine bekannte Form für einen Benutzer wiederholen kann, oder, wenn die Form unbekannt ist, eine Fehlermeldung anzeigt.

Hier ist alles in Ordnung und alles funktioniert wie erwartet. Aber schauen Sie sich an, wie viele Zeilen das gedauert hat. Sehen Sie, wie Sie mit jeder einzelnen Option umgehen müssen, die ein Benutzer durch ein elif führt Aussage?

Jetzt hat die Abbildung dieses Programms sogar noch mehr Optionen, sagen wir 20. Mit dem aktuellen Ansatz schreiben Sie ein if Anweisung mit 20 elif Abschnitte darin.

Ja, Sie werden es wahrscheinlich zum größten Teil lesen können. Aber es ist klobig, nimmt zu viel Platz ein und vor allem gibt es eine bessere Alternative.

Einführung der Case-Anweisung in Bash

Hier kommen case-Anweisungen ins Spiel. Diese können die Anzahl der Codezeilen, die Sie für die Überprüfung benötigen, im Vergleich zu if erheblich reduzieren Aussagen.

Dasselbe if Die Anweisung, die Sie verwendet haben, um die bereitgestellten Optionen zu überprüfen, könnte in einem Fall 1 folgendermaßen umgeschrieben werden:

#!/usr/bin/env bash
case "${1}" in
	"")         echo "No option was specified."; exit 1 ;;
    square)     echo "You specified 'square'." ;;
    circle)     echo "You specified 'circle'." ;;
    triangle)   echo "You specified 'triangle'." ;;
    *)          echo "Unknown shape '${1}'."; exit 1 ;;
esac

Schauen Sie, wie viel einfacher und organisierter das aussieht. Das sind 12 Zeilen Code im if -Anweisung und nur 7 im case ein. Und je mehr Optionen Sie zulassen, desto drastischer wird dieser Unterschied.

Und hier ist case Aussagen leuchten. Während beide vollständig lesbar sind, insbesondere bei einer kleinen Menge, case Statements machen auf Dauer einfach alles sauberer und wartbarer.

Wie erstellt man eine Case-Anweisung in Bash?

Fallaussagen sind mit ein wenig Übung ziemlich einfach zu verstehen. Damit sind hier die Grundlagen dessen, was vor sich geht:

Die erste Zeile, die Sie gesehen haben, war case ${1} in . Der ${1} gibt die Zeichenfolge an, gegen die geprüft wird, wobei dies das erste Argument ist, das an das Skript übergeben wird.

Betrachten Sie beispielsweise diese Case-Anweisung:

case linux in
    windows)    echo "windows" ;;
    macos)      echo "macos" ;;
    linux)      echo "linux" ;;
esac

In diesem Beispiel wird immer echo "linux" ausgeführt . Der case *string* in part gibt einfach an, gegen welchen String Sie prüfen, und dann führen die Optionen darunter die Befehle aus, sobald eine Übereinstimmung gefunden wird.

Als Nächstes beginnen Sie mit der Angabe Ihrer Optionen. Denken Sie daran, Sie hatten "" , square , circle , triangle , und * als Optionen in Ihrem ersten Skript.

Case-Anweisungen werden von oben nach unten geprüft und nur bei der ersten Übereinstimmung ausgeführt. Betrachten Sie das folgende Beispiel:

case linux in
	linux)      echo "linux" ;;
    windows)    echo "windows" ;;
    linux)      echo "linux 2.0" ;;
esac

Hier wäre der einzige Befehl, der ausgeführt würde, echo "linux" . Die zweite Übereinstimmung würde dann übersprungen, da bereits eine Übereinstimmung gefunden wurde.

Jede Zeile in einer case-Anweisung muss auch auf enden ;; . Dies bedeutet das Ende der Befehlsliste für eine Option und dass keine weiteren Befehle verarbeitet werden sollen.

Die Argumentliste in einer case-Anweisung (der linux) und windows) Teile unterstützen auch Platzhalter. Geben Sie also so etwas wie linu*) ein würde sowohl linux entsprechen und linus .

Zum Schluss beenden Sie die Case-Anweisung mit esac . Dadurch wissen Sie, dass Sie alles aufgelistet haben, was Sie verarbeiten möchten, z. B. done in einem for tun würde oder while Schleife.

Um sich das Schlüsselwort zum Beenden einer Fallaussage zu merken, merken Sie sich einfach dieses esac ist case rückwärts.

Fallaussagen in der Praxis - Argumentprüfungen

Eine häufige Verwendung von case-Anweisungen in meiner eigenen Programmierung ist der Vergleich mit einer Argumentliste.

Angenommen, Sie erlauben die Bereitstellung der folgenden Optionen für Ihr Programm:

  • --vertical
  • --add-txt
  • --replace
  • --verify

Um dies in einer Case-Anweisung zu überprüfen, könnten Sie etwa Folgendes verwenden:

while [[ "${1}" != "" ]]; do
	case "${1}" in
    	--vertical)    verticle="true" ;;
        --add-txt)     add_txt="true" ;;
        --replace)     replace="true" ;;
        --verify)      verify="true" ;;
    esac
    
    shift 1
done

Dies läuft while loop while ${1} (das erste Argument, das einem Skript gegeben wird) ist nicht leer. Es prüft dann gegen eine Argumentliste und weist Variablen zu, wenn die bereitgestellte Option gesetzt ist.

Nach Überprüfung der case-Anweisung führt es dann shift 1 aus , was den Wert von ${2} verursacht (das zweite Argument, das einem Skript bereitgestellt wird), um zum Wert von ${1} zu wechseln , und wiederholt dies mit dem neuen ${1} (früher ${2} ) bis ${1} ist auf nichts eingestellt.

Und los geht's! Das sind alle Grundlagen zur Verwendung von Case-Anweisungen.

Abschluss

Case-Anweisungen können Ihnen dabei helfen, Code sowohl schneller als auch effizienter zu schreiben. Sie helfen auch, die Dinge auf lange Sicht lesbarer und wartbarer zu machen.

Wenn Sie neu bei Bash sind, können Sie die Grundlagen von Bash in unserer Bash-Anfängerserie von Grund auf erlernen.

Haben Sie Fragen oder etwas funktioniert nicht richtig? Fühlen Sie sich frei, unten einen Kommentar zu hinterlassen, und ich werde mein Bestes tun, um zu antworten!


Linux
  1. Verwenden von Bash für die Automatisierung

  2. Export in .bashrc verwenden?

  3. 5 Beispiele für Bash-Case-Anweisungen

  4. Ausgabe des Befehls nach Spalten mit Bash aufteilen?

  5. Verwendung der Ausgabe vorheriger Befehle in Bash

Syntax und Beispiele für Bash-Case-Anweisungen

Bash-Case-Statement

Bash-Skripting – Bedingte Anweisungen

Bash-Skripting – Case-Statement

Bash-Anfängerserie Nr. 7:Entscheidungsfindung mit If Else- und Case-Anweisungen

Verwenden von Bash Sort zum Sortieren von Dateien wie ein Boss