Objetivo:
Aprender a utilizar la cláusula case en scripts de Bash para controlar el flujo del programa en función del valor de una variable, tanto para gestionar menús de opciones numéricas como para evaluar el contenido de caracteres o palabras introducidas por el usuario.
Escenario:
- Herramientas: Terminal de Linux, editor de texto en modo consola (por ejemplo,
vionano) y permisos de ejecución sobre scripts. - Conceptos clave: shell script, cláusula
case, patrones, rangos de caracteres, comodines, variables,read, permisos de ejecución.
Instrucciones:
Fase 1: Menú de opciones con case (script monitor.sh)
- Edita el script
monitor.shque ya tenías creado con un menú de 4 opciones: - Debajo de la instrucción
read, añade la estructuracaseevaluando la variable donde se guarda la opción elegida por el usuario: - Guarda los cambios y sal del editor:
- Da permisos de ejecución al script si aún no los tiene:
- Ejecuta el script y prueba cada una de las opciones (1, 2, 3, 4) y un valor fuera de rango (por ejemplo, 6):
- Comprueba que cada opción produce la salida esperada según el menú.
vi monitor.sh
case $opcion in 1) date ;; 2) cat /etc/passwd | wc -l ;; 3) uptime -s ;; 4) exit ;; *) echo "Introduzca un valor entre 1 y 4" ;; esac
:wq
chmod +x monitor.sh
./monitor.sh
Fase 2: Evaluación de caracteres con case (script caracteres.sh)
- Crea un nuevo script llamado
caracteres.sh: - Añade la cabecera del script:
- Añade una instrucción
readque solicite al usuario una palabra o número y lo guarde en una variable: - Añade la estructura
caseevaluando distintos patrones sobre esa variable: - Guarda los cambios y sal del editor:
- Da permisos de ejecución al script:
- Ejecuta el script varias veces probando diferentes entradas: una letra entre
ayc, un número entre0y9, una palabra terminada ena(por ejemplo,casa), unaXmayúscula o minúscula, y cualquier otro carácter: - Comprueba que cada entrada produce el mensaje correspondiente al patrón que cumple.
vi caracteres.sh
#!/bin/bash
read -p "Introduce una palabra o número: " palabra
case $palabra in [a-c]) echo "Es una letra a, b o c" ;; [0-9]) echo "Es un número entre 0 y 9" ;; *a) echo "Es una palabra terminada en a" ;; X|x) echo "Es una X mayúscula o minúscula" ;; *) echo "Es otro carácter" ;; esac
:wq
chmod +x caracteres.sh
./caracteres.sh
Preguntas de reflexión:
- ¿Qué ventaja ofrece la cláusula
casefrente a una cadena de condicionalesif/elif/else? - ¿Qué sintaxis general sigue la cláusula
caseen Bash? - ¿Qué función cumple el doble punto y coma (
;;) al final de cada bloque? - ¿Qué instrucción marca el final de una cláusula
case? - ¿Qué significa el patrón
*)y para qué se utiliza normalmente? - ¿Qué diferencia hay entre el patrón
[a-c]y el patrón[0-9]? - ¿Qué evalúa el patrón
*a)? - ¿Qué indica el uso de la barra vertical en el patrón
X|x)? - ¿Qué ocurre si el usuario introduce un valor que no coincide con ninguno de los patrones definidos?
- ¿Por qué es importante probar un programa con distintos valores de entrada, incluidos los que están fuera del rango esperado?
Haz clic aquí para ver las soluciones y explicaciones
1. ¿Qué ventaja ofrece la cláusula case frente a if/elif/else?
Permite evaluar múltiples valores posibles de una misma variable escribiendo menos código y de forma más legible, sin necesidad de repetir la comparación de la variable en cada condición.
2. ¿Qué sintaxis general sigue la cláusula case en Bash?
Se escribe case $variable in, seguido de los distintos patrones con sus acciones, y se cierra con esac.
3. ¿Qué función cumple el doble punto y coma (;;)?
Indica el final de las instrucciones asociadas a un patrón concreto, de forma similar a como break cierra un caso en otros lenguajes.
4. ¿Qué instrucción marca el final de una cláusula case?
La palabra clave esac, que es case escrito al revés.
5. ¿Qué significa el patrón *)?
Es el comodín que coincide con cualquier valor. Se utiliza normalmente como último patrón para capturar cualquier entrada que no haya coincidido con los patrones anteriores.
6. ¿Qué diferencia hay entre [a-c] y [0-9]?
[a-c] evalúa si el valor coincide con una única letra dentro del rango de la a a la c, mientras que [0-9] evalúa si coincide con un único dígito entre 0 y 9.
7. ¿Qué evalúa el patrón *a)?
Evalúa si el valor introducido termina en la letra a, sin importar los caracteres que la precedan.
8. ¿Qué indica el uso de la barra vertical en X|x)?
La barra vertical (|) permite indicar varios patrones alternativos para un mismo bloque de instrucciones; en este caso, coincide tanto con X mayúscula como con x minúscula.
9. ¿Qué ocurre si el usuario introduce un valor que no coincide con ningún patrón?
Si existe un patrón *), se ejecutan las instrucciones asociadas a ese patrón por defecto. Si no existe, el case no ejecuta ninguna acción para ese valor.
10. ¿Por qué es importante probar un programa con valores fuera del rango esperado?
Porque permite comprobar que el programa gestiona correctamente los casos no previstos y no falla o se comporta de forma inesperada cuando el usuario introduce datos incorrectos.
Ficha de Laboratorio: La cláusula case en Shell Script
Instrucciones de entrega:
- Rellena los campos y responde en este formulario desde tu navegador.
- Pulsa el botón de imprimir al final de la página.
- Selecciona "Guardar como PDF" en el diálogo de impresión.
- Entrega el archivo PDF en el aula virtual.
Alumno/a: Fecha:
Grupo:
Completa la ficha realizando las siguientes actividades:
- Edita el script
monitor.shy añade la estructuracasepara las opciones 1 a 4 y el valor por defecto.
Copia aquí el bloquecasecompleto que has escrito:
Explica qué comando se ejecuta para cada opción del menú:
- Ejecuta
monitor.shy prueba las opciones 1, 2, 3 y 4.
Escribe el comando utilizado para ejecutar el script:
Copia aquí la salida obtenida al probar la opción 1 (fecha):
Copia aquí la salida obtenida al probar la opción 2 (usuarios activos):
- Prueba
monitor.shintroduciendo un valor fuera del rango 1-4.
Indica el valor que has introducido:
Copia aquí el mensaje obtenido:
Explica qué patrón delcaseha gestionado esta situación:
- Crea el script
caracteres.shcon la cláusulacaseque evalúa distintos patrones.
Copia aquí el bloquecasecompleto que has escrito:
Explica qué evalúa cada uno de los patrones utilizados:
- Ejecuta
caracteres.shprobando una letra entre a-c, un número entre 0-9, una palabra terminada en "a", una "X" (mayúscula o minúscula) y otro carácter cualquiera.
Escribe el comando utilizado para dar permisos de ejecución y para ejecutar el script:
Copia aquí las cinco entradas probadas y el mensaje obtenido en cada una:
- Reflexiona sobre el orden de los patrones dentro de un
case.
Explica qué ocurriría si el patrón*)se colocara al principio en lugar de al final: