-->

Los bucles for y while en Shell Script

Objetivo:

Aprender a utilizar los bucles for y while en scripts de Bash para repetir acciones sobre un rango de valores o hasta que se cumpla una condición determinada, aplicándolos tanto en pruebas directas desde la terminal como en programas reales.

Escenario:

  • Herramientas: Terminal de Linux, editor de texto en modo consola (por ejemplo, vi o nano) y permisos de ejecución sobre scripts.
  • Conceptos clave: shell script, bucle for, bucle while, rango de valores, comodines, condición de salida, variables, incremento de variables.

Instrucciones:

Fase 1: Primeras pruebas con el bucle for

  • Sitúate en tu directorio de scripts y prueba directamente en la terminal un bucle for con una lista de valores:
  • for f in a b c
    do
      echo "La variable es: $f"
    done
  • Observa que el bucle da tantas vueltas como valores hay en la lista, mostrando el valor de f en cada una.
  • Amplía la lista de valores (por ejemplo, hasta la letra f) y comprueba que el bucle da tantas vueltas como valores nuevos se añadan.
  • Prueba ahora un bucle for usando un rango de valores entre llaves en lugar de escribir cada valor por separado:
  • for x in {a..g}
    do
      echo "La variable es: $x"
    done
  • Repite la prueba con un rango numérico:
  • for x in {0..10}
    do
      echo "La variable es: $x"
    done
  • Comprueba que en ambos casos el bucle recorre automáticamente todos los valores del rango indicado.

Fase 2: El bucle for con comodines sobre ficheros

  • Lista el contenido de tu directorio de scripts:
  • ls
  • Prueba un bucle for que recorra todos los ficheros del directorio actual utilizando el comodín *:
  • for f in *
    do
      echo "El fichero es: $f"
    done
  • Prueba ahora un bucle for que recorra únicamente los ficheros que empiecen por una letra concreta (por ejemplo, la c):
  • for f in c*
    do
      echo "El fichero es: $f"
    done
  • Comprueba que el bucle solo muestra los ficheros cuyo nombre empieza por la letra indicada.

Fase 3: Programa usuarios.sh con bucle for

  • Crea un nuevo script llamado usuarios.sh:
  • vi usuarios.sh
  • Añade la cabecera del script y el siguiente bucle for, que recorre los nombres de usuario del sistema extraídos de /etc/passwd:
  • #!/bin/bash
    for nombre in $(cat /etc/passwd | cut -d: -f1)
    do
      echo "Nombre de usuario: $nombre"
    done
  • Guarda los cambios y sal del editor:
  • :wq
  • Da permisos de ejecución al script:
  • chmod +x usuarios.sh
  • Ejecuta el script y comprueba que muestra el listado de usuarios del sistema:
  • ./usuarios.sh

Fase 4: Programa contador.sh con bucle while

  • Crea un nuevo script llamado contador.sh:
  • vi contador.sh
  • Añade la cabecera del script, una variable inicial y el bucle while que muestra los números del 1 al 10:
  • #!/bin/bash
    contador=1
    while [ $contador -le 10 ]
    do
      echo "El valor es: $contador"
      contador=$((contador + 1))
    done
  • Guarda los cambios y sal del editor:
  • :wq
  • Da permisos de ejecución al script:
  • chmod +x contador.sh
  • Ejecuta el script y comprueba que muestra los números del 1 al 10:
  • ./contador.sh
  • Modifica el valor del límite (por ejemplo, de 10 a 20) y comprueba que el bucle se adapta al nuevo valor.

Preguntas de reflexión:

  1. ¿Qué diferencia principal existe entre el bucle for y el bucle while?
  2. ¿Qué sintaxis general sigue un bucle for en Bash?
  3. ¿Qué ventaja ofrece escribir un rango entre llaves (por ejemplo, {a..g}) frente a escribir cada valor por separado?
  4. ¿Qué hace el comodín * dentro de un bucle for? ¿Y c*?
  5. En el script usuarios.sh, ¿qué función cumple cut -d: -f1 sobre la salida de /etc/passwd?
  6. ¿Qué condición controla cuántas vueltas da el bucle while en contador.sh?
  7. ¿Qué instrucción se utiliza dentro de contador.sh para incrementar el valor de la variable en cada vuelta?
  8. ¿Qué ocurriría si en contador.sh se olvidara incluir la instrucción que incrementa el contador?
  9. ¿Qué palabra clave marca el inicio y cuál marca el final del bloque de instrucciones tanto en for como en while?
  10. ¿En qué situaciones elegirías un bucle for y en cuáles un bucle while?
Haz clic aquí para ver las soluciones y explicaciones

1. ¿Qué diferencia principal existe entre for y while?

El bucle for recorre un rango o una lista de valores predefinida y se repite tantas veces como elementos tenga esa lista. El bucle while no tiene un rango fijo de valores, sino que repite las instrucciones mientras se cumpla una condición determinada.


2. ¿Qué sintaxis general sigue un bucle for en Bash?

Se escribe for variable in lista_de_valores, seguido de do, las instrucciones a repetir, y se cierra con done.


3. ¿Qué ventaja ofrece escribir un rango entre llaves?

Permite indicar un rango completo de valores (por ejemplo, de la a a la g, o del 0 al 10) sin necesidad de escribir cada valor individualmente, ahorrando tiempo y reduciendo errores.


4. ¿Qué hace el comodín *? ¿Y c*?

* hace que el bucle recorra todos los ficheros del directorio actual. c* restringe el recorrido únicamente a los ficheros cuyo nombre empieza por la letra c.


5. ¿Qué función cumple cut -d: -f1?

Corta cada línea de /etc/passwd utilizando los dos puntos (:) como separador y se queda únicamente con el primer campo, que corresponde al nombre de usuario.


6. ¿Qué condición controla las vueltas del bucle while en contador.sh?

La condición [ $contador -le 10 ], que indica que el bucle debe seguir ejecutándose mientras el valor de contador sea menor o igual que 10.


7. ¿Qué instrucción incrementa el contador?

contador=$((contador + 1)), que asigna a la variable su valor actual incrementado en una unidad.


8. ¿Qué ocurriría si no se incrementara el contador?

La variable contador nunca alcanzaría el valor límite de la condición, por lo que el bucle se ejecutaría de forma indefinida (bucle infinito).


9. ¿Qué palabras clave marcan el inicio y el final del bloque?

En ambos bucles, do marca el inicio del bloque de instrucciones y done marca su final.


10. ¿Cuándo elegir for y cuándo while?

Se elige for cuando se conoce de antemano el conjunto o rango de valores sobre el que hay que repetir una acción (una lista, un rango numérico, unos ficheros). Se elige while cuando el número de repeticiones depende de que se cumpla una condición que puede variar durante la ejecución del programa.


Ficha de Laboratorio: Los bucles for y while en Shell Script

Instrucciones de entrega:

  1. Rellena los campos y responde en este formulario desde tu navegador.
  2. Pulsa el botón de imprimir al final de la página.
  3. Selecciona "Guardar como PDF" en el diálogo de impresión.
  4. Entrega el archivo PDF en el aula virtual.

Alumno/a:      Fecha:      

Grupo:


Completa la ficha realizando las siguientes actividades:

  1. Prueba en la terminal un bucle for con una lista de valores (por ejemplo, a b c) y otro con un rango entre llaves (por ejemplo, {0..10}).
    Copia aquí el bucle utilizado con la lista de valores:

    Copia aquí el bucle utilizado con el rango entre llaves:

    Explica la diferencia entre ambas formas de indicar los valores:
  2. Prueba un bucle for que recorra todos los ficheros de tu directorio con * y otro que recorra solo los que empiezan por una letra concreta.
    Copia aquí el bucle utilizado con el comodín *:

    Copia aquí el bucle utilizado para filtrar por una letra concreta y la salida obtenida:
  3. Crea el script usuarios.sh con un bucle for que liste los usuarios del sistema.
    Copia aquí el contenido completo del script:

    Copia aquí la salida obtenida al ejecutarlo:

    Explica qué papel cumple cut -d: -f1 en este script:
  4. Crea el script contador.sh con un bucle while que muestre los números del 1 al 10.
    Copia aquí el contenido completo del script:

    Copia aquí la salida obtenida al ejecutarlo:
  5. Modifica el límite del bucle while de contador.sh (por ejemplo, de 10 a 20) y vuelve a ejecutarlo.
    Indica el nuevo valor límite utilizado:

    Copia aquí la salida obtenida:
  6. Reflexiona sobre qué ocurriría si en contador.sh se eliminara la línea que incrementa la variable contador.
    Explica qué comportamiento tendría el programa en ese caso: