Unix / Linux Shell - Il caso ... Istruzione esac
Puoi usare più file if...elifistruzioni per eseguire un ramo a più vie. Tuttavia, questa non è sempre la soluzione migliore, soprattutto quando tutti i rami dipendono dal valore di una singola variabile.
Supporti Shell case...esac dichiarazione che gestisce esattamente questa situazione, e lo fa in modo più efficiente di quanto ripetuto if ... elif.
Sintassi
La sintassi di base di case...esac istruzione è fornire un'espressione da valutare ed eseguire diverse istruzioni in base al valore dell'espressione.
L'interprete confronta ogni caso con il valore dell'espressione finché non trova una corrispondenza. Se nulla corrisponde, verrà utilizzata una condizione predefinita.
case word in
pattern1)
Statement(s) to be executed if pattern1 matches
;;
pattern2)
Statement(s) to be executed if pattern2 matches
;;
pattern3)
Statement(s) to be executed if pattern3 matches
;;
*)
Default condition to be executed
;;
esac
Qui la parola stringa viene confrontata con ogni modello finché non viene trovata una corrispondenza. Vengono eseguite le istruzioni che seguono il modello di corrispondenza. Se non vengono trovate corrispondenze, l'istruzione case termina senza eseguire alcuna azione.
Non esiste un numero massimo di pattern, ma il minimo è uno.
Quando la parte delle istruzioni viene eseguita, il comando ;; indica che il flusso del programma dovrebbe saltare alla fine dell'intera istruzione case. Questo è simile all'interruzione del linguaggio di programmazione C.
Esempio
#!/bin/sh
FRUIT="kiwi"
case "$FRUIT" in
"apple") echo "Apple pie is quite tasty."
;;
"banana") echo "I like banana nut bread."
;;
"kiwi") echo "New Zealand is famous for kiwi."
;;
esac
Dopo l'esecuzione, riceverai il seguente risultato:
New Zealand is famous for kiwi.
Un buon uso per un'istruzione case è la valutazione degli argomenti della riga di comando come segue:
#!/bin/sh
option="${1}"
case ${option} in -f) FILE="${2}"
echo "File name is $FILE" ;; -d) DIR="${2}"
echo "Dir name is $DIR" ;; *) echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac
Ecco un esempio di esecuzione del programma precedente:
$./test.sh test.sh: usage: [ -f filename ] | [ -d directory ] $ ./test.sh -f index.htm
$ vi test.sh $ ./test.sh -f index.htm
File name is index.htm
$ ./test.sh -d unix Dir name is unix $