while con Bash

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 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
Haciendo uso de la estructura while de Linux con un ejemplo básico

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
Haciendo uso de la estructura while de Linux ejecutando comandos en la condición

Bucle while con read

Podemos hacer uso del comando read de Linux en nuestro bucle while de forma sencilla. De esta forma estaremos almacenando en 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
Haciendo uso de la estructura while de Linux

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *