Bucles for en BASH

En este capítulo vamos a ver una herramienta que nos va a simplificar mucho el trabajo con, entre otras cosas, las listas.

Un bucle nos permite repetir un bloque de código tantas veces como queramos. El siguiente código repetirá el código que está entre do y done tantas veces como elementos haya después de in:

#!/bin/bash

for i in 1 2 3 4 5
do 
        echo $i
done

Si ejecutamos este script el resultado será el siguiente:

1
2
3
4
5

Para cada elemento de la lista [1 2 3 4 5] se va a ejecutar:

echo $i

y la variable $i tomará el valor del elemento que estamos “visitando”.

Formato del bucle for

El formato del for es:

for variable in lista
do
	bloque de comandos
done

O también:

for variable in lista; do
	bloque de comandos
done

¿Es una lista o una cadena?

La lista de elementos pueden ser números (como en el ejemplo) o cualquier otro elemento. En este caso usamos una lista de cadenas de texto:

#!/bin/bash

for i in uno dos tres cuatro
do 
        echo $i
done

y esto nos muestra:

uno
dos
tres
cuatro

Se ejecuta el bloque de código cuatro veces, una por cada palabra.

Pero si la lista va entre comillas ya no es una lista sino una cadena de texto con espacios:

#!/bin/bash

for i in "uno dos tres cuatro"
do 
        echo $i
done

nos mostrará lo siguiente:

uno dos tres cuatro

En este caso el bloque de código se ha ejecutado solo una vez, porque la lista tiene un único elemento que es la lista entrecomillada.

Si cada elemento va entrecomillado de manera independiente no tendremos este problema:

#!/bin/bash

for i in "uno" "dos" "tres" "cuatro"
do 
        echo $i
done

Ahora cada palabra es un elemento independiente:

uno
dos
tres
cuatro

Bucles for y rangos

El el capítulo anterior de arrays en Bash hablé de los rangos que se podían crear usando:

{0..9}

Esto nos creaba una lista con elementos del cero al nueve:

0 1 2 3 4 5 6 7 8 9

Así que podemos “recorrer” esta lista usando un bucle for:

#!/bin/bash

for i in {0..9}
do 
        echo $i
done

y nos mostrará:

0
1
2
3
4
5
6
7
8
9

Diferencia entre un array y lista

Es importante no confundir una lista con un array. El bucle for trabaja con listas. Si tenemos un array tenemos que convertirlo primero en una lista (ver el siguiente apartado).

Vimos en el capítulo anterior que este comando devolvía un array:

arrayFicheros=(`ls`)

pero si no poníamos el paréntesis lo que teníamos era una lista:

arrayFicheros=`ls`

Recorrer un array con un bucle for

Si intentamos recorrer un array con un bucle for:

#!/bin/bash

array=(1 2 3 4)
for i in $array
do
        echo $i
done

El resultado será:

1

El bucle for solo es capaz de encontrar un elemento. Para poder recorrerlo tendremos que convertirlo en una lista:

#!/bin/bash

array=(1 2 3 4)
for i in ${array[@]}
do
        echo $i
done

y, ahora sí, tendremos el resultado esperado:

1
2
3
4

Bucles for y listas de ficheros

Algo muy habitual que se hace con los bucles en Bash es trabajar con ficheros. Vimos en el capítulo anterior que podíamos tener una lista de ficheros usando:

ficheros=`ls`

Asi que podemos usar esto para trabajar con una lista de ficheros:

#!/bin/bash

lista=`ls`
for fichero in $lista
do
        echo $fichero
done

Otra forma de trabajar con ficheros es usando el carácter comodín:

for file in *
do 
        echo $file 
done

Esto mostrará la lista de ficheros que coincidan con el patrón de búsqueda. En este caso el patrón de búsqueda es '*', es decir, que mostrará todos los archivos.

Podemos restringir la búsqueda usando otro patrón, por ejemplo para mostrar solo los archivos con extensión .txt:

for file in *.txt
do 
        echo $file 
done

Si no encuentra ningún archivo mostrará el texto:

*.txt

Salir de un bucle for

Podemos salir de un bucle for siempre que queramos usando break. En este ejemplo recorreremos una lista desde 0 hasta 100 pero cuando lleguemos al 5 pararemos:

#!/bin/bash

for i in {0..100}
do
        echo $i
        if [ $i -eq 5 ]; then
                break
        fi
done

Otro formato para bucles for

Existe otro formato que podemos usar en los bucles for que es igual que el del lenguaje de programación C:

#!/bin/bash
for (( i=1; i<=5; i++ ))
do
   echo "Ciclo: $i"
done

Este for tiene tres partes:

  • i=1 ; Aquí damos el valor inicial a la variable i.
  • i<=5; Esta es la condición. El bucle seguirá ejecutándose mientras se cumpla esta condición.
  • i++; Incrementos. Después de cada “vuelta” el valor de i cambiará de valor. En este caso se incrementará en una unidad.
Autor:
Nivel: Principiante
Palabras clave:
Fecha publicado:
Fecha actualizado: 13-09-2016

Otros capítulos de la misma serie

Este capítulo es parte de la serie: Programación en BASH.

Y muchos más en preparación.

Disponible en los planes: Laravel hero PHP a tope