Objetivo:
Aplicar de forma conjunta los conocimientos vistos hasta ahora (variables, condicionales, read, sustitución de comandos) para construir un script de menú interactivo, y aprender a utilizar operadores lógicos (AND, OR, NOT) para validar los datos introducidos por el usuario, así como a personalizar el código de salida de un script con exit.
Escenario:
- Herramientas: Terminal de Linux, editor
vi, un directorioscriptsya configurado en el PATH. - Conceptos clave: menú de opciones con
read -p, encadenamiento de condiciones conelif, comandoexity código de salida personalizado, operadores lógicosAND(-ao&&),OR(-oo||) yNOT(!), validación de rangos de valores.
Instrucciones:
Fase 1: Creación del menú del script
- Crea un nuevo script llamado
monitor.sh: - Escribe el encabezado y el menú de opciones:
vi monitor.sh
#!/bin/bash echo "menú principal" echo "----------------------" echo "1- visualiza la fecha de hoy" echo "2- número de usuarios del sistema" echo "3- tiempo de funcionamiento del sistema" echo "4- salir" echo "" read -p "introduzca una opción: " opcion
Fase 2: Condición para salir del programa
- Añade la primera condición, para que el programa finalice si el usuario elige la opción 4:
if [ $opcion -eq 4 ]
then
exitFase 3: Añadir la opción de mostrar la fecha
- Encadena una nueva condición con
elifpara la opción 1:
elif [ $opcion -eq 1 ]
then
dateFase 4: Añadir la opción de contar usuarios del sistema
- Encadena otra condición con
elifpara la opción 2:
elif [ $opcion -eq 2 ]
then
cat /etc/passwd | wc -lFase 5: Añadir la opción por defecto (tiempo activo)
- Añade la rama
elsepara cuando la opción sea la 3, y cierra la condicional: - Guarda el fichero completo con
:x.
else
uptime -s
fiFase 6: Permisos y pruebas de cada opción
- Da permisos de ejecución:
- Ejecuta el script y prueba, una por una, las opciones 1, 2, 3 y 4, comprobando el resultado de cada una:
chmod +x monitor.sh
monitor.sh
Fase 7: Corrección de errores detectados
- Si al probar la opción 2 aparece un error o un resultado incorrecto, revisa la línea correspondiente con
vi monitor.shy corrige la opción dewcutilizada. - Guarda los cambios y vuelve a probar la opción 2 hasta que el número de usuarios se muestre correctamente.
Fase 8: Validación del rango de opciones con el operador OR
- Edita el script y añade, justo después de leer la opción con
read -p, una validación que compruebe que el valor está dentro del rango permitido: - Guarda los cambios con
:x.
if [ $opcion -lt 1 ] || [ $opcion -gt 4 ]
then
echo "el número debe estar entre 1 y 4"
exit 5
fiFase 9: Prueba de la validación y del código de salida
- Ejecuta el script e introduce un valor fuera de rango, por ejemplo
6: - Comprueba que aparece el mensaje de aviso y que el programa finaliza sin mostrar el menú de opciones.
- Consulta el código de salida del programa:
- Repite la prueba con otro valor fuera de rango, por ejemplo
0, y comprueba que el comportamiento es el mismo. - Consulta el contenido completo del script sin abrir el editor:
monitor.sh
echo $?
cat monitor.sh
Preguntas de reflexión:
- ¿Para qué sirve
elify en qué se diferencia de encadenar varios bloquesifindependientes? - ¿Qué hace el comando
exitdentro de un script? - ¿Qué diferencia hay entre finalizar un script con
exitsin argumentos y conexit 5? - ¿Qué comprueba el operador lógico
ANDy qué comprueba el operadorOR? - ¿Por qué en la validación del menú se utiliza el operador
ORy no el operadorAND? - ¿Qué formas existen en shell para expresar el operador
ORdentro de una condición? - ¿Qué función cumple el operador de negación
!? - ¿Qué ocurre si el usuario introduce un valor fuera del rango permitido en este script?
- ¿Por qué es importante validar la opción introducida antes de procesarla en las condiciones del menú?
- ¿Qué utilidad tiene poder consultar después el código de salida de un script con
echo $??
Haz clic aquí para ver las soluciones y explicaciones
1. ¿Para qué sirve elif?
Permite encadenar varias condiciones dentro de una misma estructura if, de modo que solo se evalúa la siguiente condición si la anterior no se ha cumplido, y todas comparten un único fi final, en lugar de tener que anidar o repetir varios bloques if independientes.
2. ¿Qué hace exit?
Finaliza la ejecución del script en el punto en el que se encuentra, devolviendo un código de salida al sistema.
3. ¿Qué diferencia hay entre exit y exit 5?
exit sin argumentos finaliza el script devolviendo el código de la última instrucción ejecutada, normalmente indicando éxito. exit 5 finaliza el script devolviendo explícitamente el código 5, que puede usarse para indicar un tipo concreto de error que otro programa podrá interpretar más adelante.
4. ¿Qué comprueban AND y OR?
AND exige que se cumplan las dos condiciones para que el resultado sea cierto. OR considera el resultado cierto si se cumple al menos una de las dos condiciones.
5. ¿Por qué se usa OR en la validación del menú?
Porque el valor introducido es inválido si es menor que 1 o si es mayor que 4; basta con que se cumpla una sola de esas dos condiciones para considerar el valor fuera de rango.
6. ¿Qué formas existen para expresar OR?
Puede expresarse con la opción -o dentro de una única expresión de test, o bien utilizando el operador || entre dos expresiones de comprobación separadas con corchetes.
7. ¿Qué función cumple !?
Invierte el resultado de una condición: convierte en verdadero lo que era falso, y en falso lo que era verdadero.
8. ¿Qué ocurre con un valor fuera de rango en este script?
El script muestra un mensaje indicando que el número debe estar entre 1 y 4, y finaliza inmediatamente con el código de salida 5, sin llegar a mostrar ni procesar el menú de opciones.
9. ¿Por qué es importante validar la opción antes de procesarla?
Porque si no se valida, un valor fuera de rango simplemente no coincidiría con ninguna de las condiciones del menú y caería por defecto en la rama else, ejecutando una acción que no corresponde a lo que el usuario quería hacer.
10. ¿Qué utilidad tiene consultar echo $? después de ejecutar el script?
Permite comprobar de forma sencilla si el script ha finalizado correctamente o con algún error concreto, lo cual es especialmente útil si este script fuera llamado desde otro programa que necesite reaccionar según el resultado obtenido.
Ficha de Laboratorio: Script de Menú, Elif, Exit y Operadores Lógicos
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:
- Crea el script
monitor.shcon el menú de cuatro opciones y la lectura conread -p.
Copia aquí el contenido del menú y la instrucción de lectura:
- Añade las condiciones con
if/elif/elsepara las cuatro opciones del menú.
Copia aquí la estructura completa de condiciones:
- Da permisos de ejecución y prueba cada una de las cuatro opciones del menú.
Escribe el comando utilizado para dar permisos:
Copia aquí el resultado obtenido con cada una de las opciones:
Indica si tuviste que corregir algún error y cuál fue:
- Añade la validación de rango con el operador
ORy el código de salida personalizado.
Copia aquí la instrucción de validación añadida:
- Ejecuta el script con un valor fuera de rango y comprueba el mensaje y el código de salida.
Escribe el valor introducido y el comando utilizado para consultar el código de salida:
Copia aquí el mensaje y el código de salida obtenidos:
- Consulta el contenido completo del script sin abrir el editor.
Escribe el comando utilizado:
Explica qué ventaja aporta la validación añadida frente a la primera versión del script: