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

5 Beispiele für Bash-Case-Anweisungen

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.


Linux
  1. Verwenden von Case-Anweisungen in Bash

  2. Bash-If-Else-Anweisung mit Beispielen

  3. 4 Beispiele für Awk-If-Anweisungen ( if, if else, if else if, :? )

  4. Bash/sh 'if else'-Anweisung

  5. Gibt es eine goto-Anweisung in bash?

Bash-Case-Statement

Bash if..else-Anweisung

35 Bash-Skriptbeispiele

Bash-Skripting – Case-Statement

So arbeiten Sie mit Case-Anweisungen in Bash-Skripten

Bash If Else Syntax mit Beispielen