Hasta ahora hemos estudiado y utilizado el bucle for, que nos permite recorrer una lista de elementos y hacer algo con cada elemento de la lista.
Pero, ¿qué sucede si queremos repetir una serie de comandos mientras se cumpla una condición?. Con el bucle for no podríamos hacerlo. Para esto tenemos el bucle while.
El bucle while nos permite crear sentencias del tiempo: «mientras se cumpla una condición repetir la ejecución de una serie de comandos»
¡¡¡Cuidado!!! Dentro del cuerpo del bucle while, que es lo que se ejecutará en cada vuelta del bucle se debería conseguir que la condición de salida del bucle se rompa o cambie. Si no, estaríamos en un bucle infinito. A lo mejor, es lo que queríamos, un bucle infinito.
Sintaxis del comando while
Como ya sabemos en shell script todas las sentencias son comandos. While es un comando más. Para obtener ayuda del comando while, ejecutamos help while.
Mientras el comando que pongamos en la zona de condiciones se ejecute correctamente, es decir devuelva un código de salida 0 (todo correcto) se ejecutará el cuerpo del bucle while. Una vez ejecutado el cuerpo del bucle, comprueba de nuevo la condición: ejecuta el comando que hayamos puesto como condición.
Es importante que en algún momento el comando CMD que tenemos como condición «no se cumpla», es decir, devuelva un código de salida de error.
Ejemplo 01 – Análisis
En la línea 6 solicitamos un valor para la variable dir. El bucle while se repetirá mientras la variable dir no esté vacía. Mientras haya algún dato en la variable dir, ejecutamos el cuerpo del while.
El comando de la línea número 10 es el que permite terminar con el bucle.
Hay que ejecutarlo como root.
Modifica el script para que antes de solicitar al usuario que escriba el nombre del nuevo directorio, se muestre el contenido del directorio base por pantalla.
Pequeño problema… estamos repitiendo una serie de comandos exactamente iguales en dos partes del script. Esto no es una buena técnica de programación.
El problema de repetir, aparte de escribir el doble, es que cualquier cambio que tengamos que hacer en ese conjunto de comandos, tendremos que hacerlo en todas las partes de nuestro programa o script dónde aparezcan.
La solución: usar funciones.
Ejemplo 02 – Análisis de código
Vamos a analizarlo…
El bucle while se repetirá mientras no se ejecute correctamente el comando ping. Esto es así porque hemos puesto una negación delante del comando ping con el caracter !.
No tenemos claro que hace la opci´ón -W del comando ping. Lo miramos en el manual:
En cuanto al comando sleep, podemos intuir que hace por los mensajes que mostramos en pantalla. No obstante, consultamos su página de manual.
En este caso deberíamos evitar que el comando que se ejecuta como condición muestre información en pantalla para evitar confundir al usuario.
Le vamos a quitar la conexión de red a nuestra máquina virtual, para comprobar que realmente funciona el script.
Versión 02 – Recibe el nombre o dirección del host por parámetro
Versión 03 – comprobar que se pasa parámetro
Comprobamos si nos han pasado parámetro. Si no se pasas valor por parámetro vamos a dar un mensaje de error y terminamos la ejecución del script con código de salida de error (1).
Versión 04 – Además, pedir el host por teclado
En lugar de terminar con la ejecución del script si no nos pasan valor por parámetro, vamos a solicitarlo al usuario por teclado.
Es decir, si no me pasan el host por parámetro, lo pedimos por teclado. Si no insertan el nombre del host por teclado, entonces vamos a dar un mensaje de error y terminamos la ejecución del script con código de salida de error (1).
Versión 05 – Mientras no tengamos host, seguimos solicitándolo
Vamos a refinar la versión anterior, de forma que si no nos pasan el nombre de host por parámetro lo vamos a pedir al usuario por teclado. Pero esta vez, mientras el nombre de host esté vacío, lo vamos a solicitar por teclado al usuario.
Si le pasamos un valor en el primer parámetro, la variable host no estar´á vaía.
La condición del bucle while de la línea 6 no se cumple. La variable host no está vacía. Por eso no entra en el bucle y no se ejecuta ni una sola vez el comando read de la línea 7.
Ejemplo 03 – Desarrollo
Vamos a crear un script que solicite al operador el nombre de un usuario. Mientras el operador inserte el nombre de una cuenta de usuario, comprobaremos si la cuenta existe en el sistema. Si la cuenta existe mostraremos en pantalla la siguiente información: nombre de la cuenta, uid, gid y ruta del directorio personal del usuario. Sino crearemos una nueva cuenta de usuario para este usuario.
Recomendaciones o pistas
Paso 1: Estructura del script
Comienza estructurando tu script. Si eres capaz de hacer el bucle while de forma que se repita mientras el usuario inserte datos, nombres de usuario, ya tenemos la estructura básica del script hecha.
Paso 2: Céntrate en el cuerpo del bucle
Una vez tengas hecho el bucle, céntrate en lo que tienen que hacer el bucle. Puedes probar los comandos en una terminal para asegurarte de que hacen lo que tienen que hacer. Ahora no tienes que pensar en el bucle, porque se ejecuta cuando tiene que ejecutarse.
Paso 3. Sentencia condicional
Mira la estructura condicional: Si el usuario existe… sino…. Piensa en qué comando te permite comprobar si un usuario existe o no en el sistema.
Una vez lo tengas claro, puedes escribir la sentencia condicional sin hacer nada, solo mostrando que estás en una rama (then) o en otra (else) con comandos echo.
Cuando todo funcione, nos centramos en la funcionalidad de cada rama.
Paso 5. Funcionalidad del if
Ahora desarrollamos la funcionalidad de cada una de las ramas del if: then y else. Es decir, vamos a centrarnos en el cuerpo del then, que deberá obtener información del fichero de cuentas de usuario, y del else, que deber´á crear la cuenta de usuario.
Solución
Paso1. Bucle while
Solución propuesta
Ejemplo de ejecución
Ejercicio 04 – Desarrollo
Ejercicio propuesto para generar ficheros con información. El script almacenará en un fichero llamado cursos.txt almacenado en /educatica.
Antes de comenzar con el proceso de solicitud de información y escritura de datos, añadiendo siempre nueva información, el script comprobará que el directorio /educatica existe. Si no existe, lo creará.
Ahora, el script comprobará si el fichero cursos.txt existe en el directorio /educatica. Si el fichero no existe, mostrará un mensaje indicando que el fichero no existe. Si existe, mostrará el nombre de todos los cursos almacenados en dicho fichero.
Este fichero sigue la siguiente nomenclatura:
El fichero contendrá una línea para cada curso. Cada línea contendrá los campos que se detallan a continuación, separados por el caracter «:»
- Nombre. Nombre del curso.
- Alumnos. Lista de usuarios que estarán matriculados en el curso. la lista estará separada por comas.
Una vez mostrados los cursos, el script solicitará el nombre de un nuevo curso. Si el usuario no inserta ningún dato, el script terminará con un mensaje de error adecuado y devolverá un código de salida de error.
Si el operador inserta el nombre de un curso que ya existe, el script lo notificará y terminará con un mensaje de advertencia devolviendo un código de error.
Si el curso no existe, el script pedirá nombres de alumnos al usuario mientras este inserte nuevos nombres. Es decir, mientras el operador inserte nombres de nuevos alumnos, el script los irá anotando. Cuando el usuario no inserte más nombres de alumnos, el script añadirá la información del nuevo curso y sus miembros al final del fichero.
Dejar una respuesta