L'istruzione bash shell case è simile all'istruzione switch in C. Può essere utilizzata per testare valori semplici come numeri interi e caratteri.
L'istruzione Case non è un ciclo, non esegue un blocco di codice per n numero di volte. Invece, bash shell controlla la condizione e controlla il flusso del programma.
In questo articolo esaminiamo il comando bash case con 5 esempi pratici.
Il costrutto case nella shell bash ci consente di testare le stringhe rispetto a modelli che possono contenere caratteri jolly. L'istruzione bash case è la forma più semplice dell'istruzione bash if-then-else.
Sintassi dell'istruzione bash case.
case expression in pattern1 ) statements ;; pattern2 ) statements ;; ... esac
Di seguito sono riportati i punti chiave delle dichiarazioni bash case:
- L'istruzione Case prima espande l'espressione e cerca di confrontarla con ogni modello.
- Quando viene trovata una corrispondenza, vengono eseguite tutte le istruzioni associate fino al doppio punto e virgola (;;).
- Dopo la prima corrispondenza, il caso termina con lo stato di uscita dell'ultimo comando eseguito.
- Se non c'è corrispondenza, lo stato di uscita del caso è zero.
Esempio di caso Bash 1. Invio di segnali a un processo
Lo script seguente accetta il numero del segnale e l'ID processo come argomenti e invia il segnale a un determinato ID processo utilizzando il nome del segnale.
Questo script serve a dimostrare l'uso dell'istruzione case.
$ 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
Nell'esempio sopra:
- $1 e $2 sono rispettivamente il numero del segnale e l'ID del processo.
- Usando il comando kill, invia il segnale corrispondente all'id di processo fornito.
- Esegue il comando sleep per alcuni secondi.
- L'ultimo confronto facoltativo *) è un caso predefinito e corrisponde a qualsiasi cosa.
Utilizzo dello script di shell sopra:scopri l'id di processo del comando sleep e invia il segnale di kill a quell'id di processo per terminare il processo.
$ sleep 1000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signal.sh 9 23277 Sending SIGKILL signal $ sleep 1000 Killed
Inoltre, fai riferimento al nostro precedente articolo kill:4 metodi per terminare un processo.
Esempio di caso Bash. 2. Pattern Match in un file
Questo esempio stampa il numero di righe, il numero di parole ed elimina le righe che corrispondono allo schema dato.
$ 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
L'esecuzione dello script precedente è mostrata di seguito.
$ 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.
Output regex di bash case. Dopo aver cancellato le linee, corrisponde al pattern Vim:
$ ./fileop.sh -d Vim text It is the most popular editor amongst Linux Journal readers.
Inoltre, fai riferimento al nostro precedente articolo su Bash ~ espansione e { } espansione.
Esempio caso Bash 3. Trova il tipo di file dall'estensione
Questo esempio stampa il tipo di file (testo, Csource, ecc.) in base all'estensione del nome del file.
$ 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
Esempio caso Bash 4. Richiedi all'utente Sì o No
Nella maggior parte dell'installazione del software, durante il contratto di licenza, verrà chiesto sì o no input dall'utente. Il seguente frammento di codice è uno dei modi per ottenere l'input sì o no dall'utente.
$ 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
Se sono presenti diversi modelli separati da caratteri pipe, l'espressione può corrispondere a uno qualsiasi di essi per eseguire le istruzioni associate. I modelli vengono controllati in ordine finché non viene trovata una corrispondenza; se non viene trovato, non succede nulla.
Inoltre, fai riferimento al nostro precedente articolo sui 15 esempi di array bash.
Esempio di caso Bash 5. Script di avvio
Gli script di avvio nella directory /etc/init.d utilizzano l'istruzione case per avviare e arrestare l'applicazione.
Puoi usare qualsiasi tipo di pattern, ma è sempre consigliato usare l'istruzione case, quando stai testando i valori delle primitive. (es. numeri interi o caratteri).
$ 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
Lettura consigliata
Bash 101 Hacks, di Ramesh Natarajan . Passo la maggior parte del mio tempo in ambiente Linux. Quindi, naturalmente sono un grande fan della riga di comando di Bash e degli script di shell. 15 anni fa, quando stavo lavorando su diverse versioni di *nix, scrivevo molto codice sulla shell C e sulla shell Korn. Negli anni successivi, quando ho iniziato a lavorare su Linux come amministratore di sistema, ho praticamente automatizzato ogni possibile attività utilizzando lo scripting della shell Bash. Sulla base della mia esperienza con Bash, ho scritto l'eBook Bash 101 Hacks che contiene 101 esempi pratici sia sulla riga di comando di Bash che sugli script di shell. Se stavi pensando di padroneggiare Bash, fatti un favore e leggi questo libro, che ti aiuterà a prendere il controllo della tua riga di comando di Bash e degli script della shell.