Die Case-Anweisung der Bash-Shell ähnelt der switch-Anweisung in C. Sie kann zum Testen einfacher Werte wie Ganzzahlen und verwendet werden Zeichen.
Die Case-Anweisung ist keine Schleife, sie führt einen Codeblock nicht n-mal aus. Stattdessen überprüft die Bash-Shell die Bedingung und steuert den Ablauf des Programms.
Lassen Sie uns in diesem Artikel den Bash-Case-Befehl anhand von 5 praktischen Beispielen überprüfen.
Das Case-Konstrukt in der Bash-Shell ermöglicht es uns, Zeichenfolgen anhand von Mustern zu testen, die Platzhalterzeichen enthalten können. Die Bash-Case-Anweisung ist die einfachste Form der Bash-If-Then-Else-Anweisung.
Syntax der Bash-Case-Anweisung.
case expression in pattern1 ) statements ;; pattern2 ) statements ;; ... esac
Im Folgenden sind die wichtigsten Punkte von Bash-Case-Anweisungen aufgeführt:
- Die Case-Anweisung erweitert zuerst den Ausdruck und versucht, ihn mit jedem Muster abzugleichen.
- Wenn eine Übereinstimmung gefunden wird, werden alle zugehörigen Anweisungen bis zum doppelten Semikolon (;;) ausgeführt.
- Nach der ersten Übereinstimmung endet case mit dem Exit-Status des zuletzt ausgeführten Befehls.
- Wenn es keine Übereinstimmung gibt, ist der Ausgangsstatus des Falls Null.
Bash-Fallbeispiel 1. Signal an einen Prozess senden
Das folgende Skript akzeptiert die Signalnummer und die Prozess-ID als Argumente und sendet das Signal unter Verwendung des Signalnamens an eine bestimmte Prozess-ID.
Dieses Skript soll die Verwendung der case-Anweisung demonstrieren.
$ cat signal.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage : $0 Signalnumber PID" exit fi case "$1" in 1) echo "Sending SIGHUP signal" kill -SIGHUP $2 ;; 2) echo "Sending SIGINT signal" kill -SIGINT $2 ;; 3) echo "Sending SIGQUIT signal" kill -SIGQUIT $2 ;; 9) echo "Sending SIGKILL signal" kill -SIGKILL $2 ;; *) echo "Signal number $1 is not processed" ;; esac
Im obigen Beispiel:
- $1 und $2 sind die Signalnummer bzw. die Prozess-ID.
- Unter Verwendung des Kill-Befehls sendet es das entsprechende Signal an die angegebene Prozess-ID.
- Es führt den Sleep-Befehl für einige Sekunden aus.
- Der optionale letzte Vergleich *) ist ein Standardfall und passt zu allem.
Verwendung des obigen Shell-Skripts:Finden Sie die Prozess-ID des Sleep-Befehls heraus und senden Sie ein Kill-Signal an diese Prozess-ID, um den Prozess zu beenden.
$ sleep 1000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signal.sh 9 23277 Sending SIGKILL signal $ sleep 1000 Killed
Siehe auch unseren früheren Kill-Artikel – 4 Methoden, um einen Prozess zu beenden.
Bash-Fallbeispiel. 2. Musterabgleich in einer Datei
Dieses Beispiel gibt die Anzahl der Zeilen und die Anzahl der Wörter aus und löscht die Zeilen, die dem angegebenen Muster entsprechen.
$ cat fileop.sh #!/bin/bash # Check 3 arguments are given # if [ $# -lt 3 ] then echo "Usage : $0 option pattern filename" exit fi # Check the given file is exist # if [ ! -f $3 ] then echo "Filename given \"$3\" doesn't exist" exit fi case "$1" in # Count number of lines matches -i) echo "Number of lines matches with the pattern $2 :" grep -c -i $2 $3 ;; # Count number of words matches -c) echo "Number of words matches with the pattern $2 :" grep -o -i $2 $3 | wc -l ;; # print all the matched lines -p) echo "Lines matches with the pattern $2 :" grep -i $2 $3 ;; # Delete all the lines matches with the pattern -d) echo "After deleting the lines matches with the pattern $2 :" sed -n "/$2/!p" $3 ;; *) echo "Invalid option" ;; esac
Die Ausführung des obigen Skripts wird unten gezeigt.
$ cat text Vim is a text editor released by Bram Moolenaar in 1991 for the Amiga computer. The name "Vim" is an acronym for "Vi IMproved" because Vim was created as an extended version of the vi editor, with many additional features designed to be helpful in editing program source code. Although Vim was originally released for the Amiga, Vim has since been developed to be cross-platform, supporting many other platforms. It is the most popular editor amongst Linux Journal readers.
Bash-Case-Regex-Ausgabe. Nach dem Löschen der Zeilen Übereinstimmungen mit dem Muster Vim:
$ ./fileop.sh -d Vim text It is the most popular editor amongst Linux Journal readers.
Siehe auch unseren früheren Artikel über Bash ~ Erweiterung und { } Erweiterung.
Bash-Fallbeispiel 3. Dateityp anhand der Erweiterung finden
Dieses Beispiel gibt den Typ einer Datei (Text, Csource usw.) basierend auf der Erweiterung des Dateinamens aus.
$ cat filetype.sh #!/bin/bash for filename in $(ls) do # Take extension available in a filename ext=${filename##*\.} case "$ext" in c) echo "$filename : C source file" ;; o) echo "$filename : Object file" ;; sh) echo "$filename : Shell script" ;; txt) echo "$filename : Text file" ;; *) echo " $filename : Not processed" ;; esac done $ ./filetype.sh a.c : C source file b.c : C source file c1.txt : Text file fileop.sh : Shell script obj.o : Object file text : Not processed t.o : Object file
Bash-Fallbeispiel 4. Benutzer mit Ja oder Nein auffordern
Bei den meisten Softwareinstallationen wird der Benutzer während der Lizenzvereinbarung nach einer Ja- oder Nein-Eingabe gefragt. Das folgende Code-Snippet ist eine Möglichkeit, die Ja- oder Nein-Eingabe des Benutzers zu erhalten.
$ cat yorno.sh #!/bin/bash echo -n "Do you agree with this? [yes or no]: " read yno case $yno in [yY] | [yY][Ee][Ss] ) echo "Agreed" ;; [nN] | [n|N][O|o] ) echo "Not agreed, you can't proceed the installation"; exit 1 ;; *) echo "Invalid input" ;; esac $ ./yorno.sh Do you agree with this? [yes or no]: YES Agreed
Wenn es mehrere durch senkrechte Striche getrennte Muster gibt, kann der Ausdruck mit jedem davon übereinstimmen, damit die zugehörigen Anweisungen ausgeführt werden. Die Muster werden der Reihe nach geprüft, bis eine Übereinstimmung gefunden wird; wenn keiner gefunden wird, passiert nichts.
Siehe auch unseren früheren Artikel mit 15 Bash-Array-Beispielen.
Bash-Fallbeispiel 5. Startskript
Startskripte im Verzeichnis /etc/init.d verwenden die case-Anweisung, um die Anwendung zu starten und zu stoppen.
Sie können jede Art von Mustern verwenden, aber es wird immer empfohlen, Case-Anweisungen zu verwenden, wenn Sie Werte von Primitiven testen. (dh ganze Zahlen oder Zeichen).
$ cat startpcapp #!/bin/bash case "$1" in 'start') echo "Starting application" /usr/bin/startpc ;; 'stop') echo "Stopping application" /usr/bin/stoppc ;; 'restart') echo "Usage: $0 [start|stop]" ;; esac $ ./startpcapp start Starting application /usr/bin/startpc started
Empfohlene Lektüre
Bash 101 Hacks, von Ramesh Natarajan . Ich verbringe die meiste Zeit in der Linux-Umgebung. Daher bin ich natürlich ein großer Fan von Bash-Befehlszeilen- und Shell-Skripten. Vor 15 Jahren, als ich an verschiedenen Varianten von *nix arbeitete, habe ich viel Code auf der C-Shell und der Korn-Shell geschrieben. Später, als ich anfing, als Systemadministrator an Linux zu arbeiten, automatisierte ich so ziemlich jede mögliche Aufgabe mit Bash-Shell-Scripting. Basierend auf meiner Bash-Erfahrung habe ich das eBook „Bash 101 Hacks“ geschrieben, das 101 praktische Beispiele sowohl für die Bash-Befehlszeile als auch für Shell-Scripting enthält. Wenn Sie darüber nachgedacht haben, Bash zu meistern, tun Sie sich selbst einen Gefallen und lesen Sie dieses Buch, das Ihnen helfen wird, die Kontrolle über Ihre Bash-Befehlszeile und Ihr Shell-Skripting zu übernehmen.