La declaración de caso en scripts bash se usa cuando se debe tomar una decisión contra múltiples opciones. En otras palabras, es útil cuando una expresión tiene la posibilidad de tener múltiples valores. Esta metodología se puede ver como un reemplazo de varias declaraciones if en un script. La declaración de caso tiene una ventaja sobre las declaraciones if porque mejora la legibilidad de nuestro código y son más fáciles de mantener. Las declaraciones de casos en un script Bash son bastante similares a las declaraciones de casos en lenguaje C. Pero a diferencia de C, la instrucción Bash Case deja de continuar la búsqueda tan pronto como se produce la coincidencia. En palabras simples, no requieren ninguna declaración de interrupción que sea obligatoria para usarse en C para dejar de buscar un patrón.
La sintaxis básica de una declaración de caso se da a continuación,
Sintaxis:
case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac
- Una declaración de caso comienza con la palabra clave case seguida de una expresión y la palabra clave.
- Termina con la palabra clave esac .
- Se pueden utilizar varios casos de patrones separados por | operador.
- El operador de paréntesis de cierre ‘)’ se utiliza para finalizar la lista de casos de patrones.
- Un caso de patrón puede contener caracteres especiales.
- Un caso patrón y su cuerpo se denominan cláusula.
- El cuerpo del caso del patrón debe ir seguido de ;;.
- En caso de que una expresión coincida con dos casos de patrones, en tal caso se ejecuta el cuerpo correspondiente al primer caso de patrón coincidente que coincida con la expresión.
- Al igual que C proporciona una palabra clave predeterminada para la declaración predeterminada, del mismo modo en la declaración del caso Bash, podemos usar el símbolo de asterisco comodín (*) y definir un caso de patrón final para definir el caso predeterminado.
- En caso de que no coincida ningún patrón, el estado de retorno es cero. De lo contrario, el estado de retorno es el estado de salida del cuerpo ejecutado del caso de patrón coincidente.
Ejemplo 1: generar una descripción para cada opción
En este ejemplo, un script permite al usuario seleccionar un departamento y muestra una descripción correspondiente a la entrada con la ayuda de un comando de eco. En este script, hemos asignado la variable DEPARTAMENTO como «Informática». Por lo tanto, se ejecuta el cuerpo del primer caso de patrón.
Puede seguir las instrucciones que se detallan a continuación:
1. Abra la terminal (Ctrl + Alt + T) y cree el script:
department.sh
2. Agregue estas declaraciones al script:
#!/bin/bash DEPARTMENT="Computer Science" echo -n "Your DEPARTMENT is " case $DEPARTMENT in "Computer Science") echo -n "Computer Science" ;; "Electrical and Electronics Engineering" | "Electrical Engineering") echo -n "Electrical and Electronics Engineering or Electrical Engineering" ;; "Information Technology" | "Electronics and Communication") echo -n "Information Technology or Electronics and Communication" ;; *) echo -n "Invalid" ;; esac
3. A continuación se describe cada una de las líneas:
- La primera línea del guión comienza con el shebang (#!).
- Le indica al sistema operativo que use un intérprete particular para analizar el script.
- Hemos inicializado una variable DEPARTAMENTO como «Informática».
- Ahora, estamos usando una declaración de caso.
- Cada expresión ha sido manejada a través de la sentencia case.
- La última línea, esac, se ha utilizado para terminar la declaración del caso.
4. Guarde el guión.
5. Ejecute el script.
./department.sh
Producción:
Ejemplo 2: uso de casos de patrones múltiples
En cada cláusula, podemos usar múltiples casos de patrones. Si la expresión coincide con al menos un caso de patrón, el cuerpo de la cláusula se ejecuta. En este script, hemos asignado la variable DEPARTAMENTO como “Electrónica y Comunicación”. El tercer caso de patrón tiene dos valores separados por el operador de barra vertical ( | ). Por lo tanto, se ejecuta el cuerpo del caso del tercer patrón.
Puede seguir las instrucciones que se detallan a continuación:
1. Abra la terminal (Ctrl + Alt + T) y cree el script:
department.sh
2. Agregue estas declaraciones al script:
#!/bin/bash DEPARTMENT="Electronics and Communication" echo -n "Your DEPARTMENT is " case $DEPARTMENT in "Computer Science") echo -n "Computer Science" ;; "Electrical and Electronics Engineering" | "Electrical Engineering") echo -n "Electrical and Electronics Engineering or Electrical Engineering" ;; "Information Technology" | "Electronics and Communication") echo -n "Information Technology or Electronics and Communication" ;; *) echo -n "Invalid" ;; esac
3. Cada una de las líneas se ha comentado a continuación:
- La primera línea del guión comienza con el shebang (#!).
- Le indica al sistema operativo que use un intérprete particular para analizar el script.
- Hemos inicializado una variable DEPARTAMENTO como “Electrónica y Comunicación”.
- Ahora, estamos usando una declaración de caso.
- Cada expresión ha sido manejada a través de la sentencia case.
- La última línea, esac, se ha utilizado para terminar la declaración del caso.
4. Guarde el guión.
5. Ejecute el script.
./department.sh
Producción:
3. Guarde el guión.
5. Ejecute el script.
./department.sh
Ejemplo 3: bucles for
En este script, hemos asignado el departamento de tres estudiantes de una clase en una array DEPARTAMENTO. En otras palabras, vamos a procesar más de una expresión que se describe en la variable DEPARTAMENTO. Para iterar sobre múltiples expresiones, podemos usar un bucle for a.
Puede seguir las instrucciones que se detallan a continuación:
1. Abra la terminal (Ctrl + Alt + T) y cree el script:
department.sh
2. Agregue estas declaraciones al script:
#!/bin/bash DEPARTMENT=("Electronics and Communication", "Computer Science", "Information Technology") for value in "${DEPARTMENT[@]}" do case $value in "Computer Science") echo -n "Computer Science " ;; "Electrical and Electronics Engineering" | "Electrical Engineering") echo -n "Electrical and Electronics Engineering or Electrical Engineering " ;; "Information Technology" | "Electronics and Communication") echo -n "Information Technology or Electronics and Communication " ;; *) echo -n "Invalid " ;; esac done
3. A continuación se describe cada una de las líneas:
- La primera línea del guión comienza con el shebang (#!).
- Le indica al sistema operativo que use un intérprete particular para analizar el script.
- Hemos inicializado una array DEPARTAMENTO con tres strings literales.
- Ahora, con la ayuda de un ciclo for, estamos iterando sobre la array de elementos.
- Cada expresión ha sido manejada a través de la sentencia case.
- La última línea, esac, se ha utilizado para terminar la declaración del caso.
4. Guarde el guión.
5. Ejecute el script.
./department.sh
Producción:
Ejemplo 4: Preguntar al usuario con Sí o No
Puede seguir las instrucciones que se detallan a continuación:
1. Abra la terminal (Ctrl + Alt + T) y cree el script:
student.sh
2. Agregue estas declaraciones al script:
#!/bin/bash echo -n "Are you a student? [yes or no]: " read response case $response in "Y" | "y" | "YES" | "Yes" | "yes") echo -n "Yes, I am a student." ;; "N" | "n" | "No" | "NO" | "no" | "nO") echo -n "No, I am not a student."; ;; *) echo -n "Invalid input" ;; esac
3. A continuación se explica cada una de las líneas:
- La primera línea del guión comienza con el shebang (#!).
- Le indica al sistema operativo que use un intérprete particular para analizar el script.
- Al usuario se le pregunta «¿Eres un estudiante? [si o no]».
- Ahora el usuario da una respuesta a través del teclado.
- La salida de la respuesta se ha manejado a través de una declaración de caso.
- La última línea, esac, se ha utilizado para terminar la declaración del caso.
4. Guarde el guión.
5. Ejecute el script usando el siguiente comando.
./student.sh
Producción:
Ejemplo 5: Envío de señal a un proceso
Puede seguir las instrucciones que se detallan a continuación:
1. Abra la terminal (Ctrl + Alt + T) y cree el script:
signals.sh
2. Agregue estas declaraciones al script:
#!/bin/bash if [ $# -lt 2 ] then echo "Usage : $0 Signalnumber PID" exit fi # Case statement # Signal number (expression) 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 ;; 4) echo "Sending SIGKILL signals....." kill -SIGKILL $2 ;; *) echo "Signal number $1 has not been processed" ;; esac
3. A continuación se explica cada una de las líneas:
- $1 es el número de señal y $2 es la identificación del proceso.
- Para pasar o enviar una señal a la identificación del proceso dado, estamos usando el comando matar.
- Esto ejecutará el comando de suspensión durante unos segundos.
- El cuerpo de la última comparación opcional *) se ejecutará en el caso predeterminado.
4. Guarde el guión.
5. Ejecute el script usando el siguiente comando.
./signals.sh
Producción:
$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed