Estructura de control while para Linux
La estructura de control while en Linux permite incluir un bucle en nuestros script. Estos bucles son los encargados de que un bloque de código se repita las veces que necesitemos mientras (while) se cumpla cierta condición.
El bucle for y el bucle while de Linux son dos de los unos de los más usados en programación.
while [condición]
do
# Bloque de código que se repite
done
A la hora de crear la estructura while (mientras) debemos tener en cuenta sobre todo una cuestión, en algún momento de la ejecución del script la condición debe cumplirse, de otra forma estaríamos creando un bucle infinito.
De la misma forma que con la estructura if en Linux, podemos crear diferentes comparaciones para nuestros bucles while. Vamos a ir viéndolas una a una con ejemplos.
Comparaciones numéricas con Bash
- -eq: Igual a (equal).
- -ne: diferente de (not equal).
- -gt: mayor que (greater than).
- -lt: Menor que (less than).
- -ge: Mayor o igual que (greater than or equal).
- -le: Menor o igual que (less than or equal).
En el siguiente ejemplo hacemos uso del comparador -ne (not equal). Comenzando con el valor cero, sumará uno en cada iteración mientras no sea igual a cinco. En cada iteración muestra en pantalla la palabra Línea acompañada del valor del contador.
#!/bin/bash
contador=0
while [ $contador -ne 5 ];
do
echo "Línea $contador"
contador=$(($contador + 1))
done

Basando la condición en comandos externos
Para el siguiente ejemplo (algo más complejo) haremos uso en la condición del while de algunos comandos: ls, grep y wc. De esta forma sabremos el número de ficheros que tenemos en el directorio activo. Nuestra condición será llegar a disponer de un número determinado de ficheros.
Primero vamos a crear una condición para saber cuántos archivos hay en el directorio.
ls -l | grep -v '^d' | wc -l
- ls -l: Realiza un listado largo del directorio activo.
- grep -v ‘^d’: realiza una búsqueda en las líneas generadas por ls -l y «rescata» las que no comiencen por la letra d.
- wc -l: muestra el número de líneas del resultado obtenido con grep -v ‘^d’.
De esta forma podemos conocer en cada iteración el número de ficheros que contiene nuestro directorio. Si el valor es menor de diez, crearemos archivos de texto con un nombre aleatorio ($RANDOM) y mostrando el mensaje «Creado» en cada creación.
#!/bin/bash
while [ $(ls -l | grep -v '^d' | wc -l) -lt 10 ];
do
nombre="$RANDOM.txt"
touch $nombre
echo "Creado el archivo $nombre"
done

Bucle while con read
Podemos hacer uso del comando read de Linux en nuestro bucle while de forma sencilla. De esta forma estaremos almacenando es nuestra variable cada uno de los valores que almacenemos.
#!/bin/bash
while read -p "Introduce: " valor
do
echo "Has introducido: $valor"
done
Para que este ejemplo anterior no sea un bucle infinito deberíamos controlar lo que se introduce y poder salir de alguna manera.
Añadiremos el comando if para comprar el texto introducido y saldremos del bucle while cuando nuestro usuario introduzca la palabra salir.
#!/bin/bash
while read -p "Introduce: " valor
do
if [ $valor == "salir" ]; then break; fi
echo "Has introducido: $valor"
done
