Shell de Unix / Linux - El caso ... Declaración esac
Puede utilizar varios if...elifdeclaraciones para realizar una rama de múltiples vías. Sin embargo, esta no es siempre la mejor solución, especialmente cuando todas las ramas dependen del valor de una sola variable.
Soportes de Shell case...esac declaración que maneja exactamente esta situación, y lo hace de manera más eficiente que las declaraciones if ... elif repetidas.
Sintaxis
La sintaxis básica del case...esac declaración es dar una expresión para evaluar y ejecutar varias declaraciones diferentes basadas en el valor de la expresión.
El intérprete compara cada caso con el valor de la expresión hasta que encuentra una coincidencia. Si nada coincide, se utilizará una condición predeterminada.
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
Aquí la palabra de cadena se compara con cada patrón hasta que se encuentra una coincidencia. Se ejecutan las declaraciones que siguen el patrón coincidente. Si no se encuentran coincidencias, la declaración de caso se cierra sin realizar ninguna acción.
No hay un número máximo de patrones, pero el mínimo es uno.
Cuando se ejecuta la parte de la declaración (es), el comando ;; indica que el flujo del programa debe saltar al final de toda la declaración del caso. Esto es similar a romper en el lenguaje de programación C.
Ejemplo
#!/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
Tras la ejecución, recibirá el siguiente resultado:
New Zealand is famous for kiwi.
Un buen uso para una declaración de caso es la evaluación de los argumentos de la línea de comandos de la siguiente manera:
#!/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
Aquí hay una muestra de ejecución del programa anterior:
$./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
$