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,
vionano) y permisos de ejecución sobre scripts. - Conceptos clave: shell script, bucle
for, buclewhile, 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
forcon una lista de valores: - Observa que el bucle da tantas vueltas como valores hay en la lista, mostrando el valor de
fen 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
forusando un rango de valores entre llaves en lugar de escribir cada valor por separado: - Repite la prueba con un rango numérico:
- Comprueba que en ambos casos el bucle recorre automáticamente todos los valores del rango indicado.
for f in a b c do echo "La variable es: $f" done
for x in {a..g}
do
echo "La variable es: $x"
donefor x in {0..10}
do
echo "La variable es: $x"
doneFase 2: El bucle for con comodines sobre ficheros
- Lista el contenido de tu directorio de scripts:
- Prueba un bucle
forque recorra todos los ficheros del directorio actual utilizando el comodín*: - Prueba ahora un bucle
forque recorra únicamente los ficheros que empiecen por una letra concreta (por ejemplo, lac): - Comprueba que el bucle solo muestra los ficheros cuyo nombre empieza por la letra indicada.
ls
for f in * do echo "El fichero es: $f" done
for f in c* do echo "El fichero es: $f" done
Fase 3: Programa usuarios.sh con bucle for
- Crea un nuevo script llamado
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: - Guarda los cambios y sal del editor:
- Da permisos de ejecución al script:
- Ejecuta el script y comprueba que muestra el listado de usuarios del sistema:
vi usuarios.sh
#!/bin/bash for nombre in $(cat /etc/passwd | cut -d: -f1) do echo "Nombre de usuario: $nombre" done
:wq
chmod +x usuarios.sh
./usuarios.sh
Fase 4: Programa contador.sh con bucle while
- Crea un nuevo script llamado
contador.sh: - Añade la cabecera del script, una variable inicial y el bucle
whileque muestra los números del 1 al 10: - Guarda los cambios y sal del editor:
- Da permisos de ejecución al script:
- Ejecuta el script y comprueba que muestra los números del 1 al 10:
- Modifica el valor del límite (por ejemplo, de 10 a 20) y comprueba que el bucle se adapta al nuevo valor.
vi contador.sh
#!/bin/bash contador=1 while [ $contador -le 10 ] do echo "El valor es: $contador" contador=$((contador + 1)) done
:wq
chmod +x contador.sh
./contador.sh
Preguntas de reflexión:
- ¿Qué diferencia principal existe entre el bucle
fory el buclewhile? - ¿Qué sintaxis general sigue un bucle
foren Bash? - ¿Qué ventaja ofrece escribir un rango entre llaves (por ejemplo,
{a..g}) frente a escribir cada valor por separado? - ¿Qué hace el comodín
*dentro de un buclefor? ¿Yc*? - En el script
usuarios.sh, ¿qué función cumplecut -d: -f1sobre la salida de/etc/passwd? - ¿Qué condición controla cuántas vueltas da el bucle
whileencontador.sh? - ¿Qué instrucción se utiliza dentro de
contador.shpara incrementar el valor de la variable en cada vuelta? - ¿Qué ocurriría si en
contador.shse olvidara incluir la instrucción que incrementa el contador? - ¿Qué palabra clave marca el inicio y cuál marca el final del bloque de instrucciones tanto en
forcomo enwhile? - ¿En qué situaciones elegirías un bucle
fory en cuáles un buclewhile?
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:
- Rellena los campos y responde en este formulario desde tu navegador.
- Pulsa el botón de imprimir al final de la página.
- Selecciona "Guardar como PDF" en el diálogo de impresión.
- Entrega el archivo PDF en el aula virtual.
Alumno/a: Fecha:
Grupo:
Completa la ficha realizando las siguientes actividades:
- Prueba en la terminal un bucle
forcon 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:
- Prueba un bucle
forque 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:
- Crea el script
usuarios.shcon un bucleforque liste los usuarios del sistema.
Copia aquí el contenido completo del script:
Copia aquí la salida obtenida al ejecutarlo:
Explica qué papel cumplecut -d: -f1en este script:
- Crea el script
contador.shcon un buclewhileque muestre los números del 1 al 10.
Copia aquí el contenido completo del script:
Copia aquí la salida obtenida al ejecutarlo:
- Modifica el límite del bucle
whiledecontador.sh(por ejemplo, de 10 a 20) y vuelve a ejecutarlo.
Indica el nuevo valor límite utilizado:
Copia aquí la salida obtenida:
- Reflexiona sobre qué ocurriría si en
contador.shse eliminara la línea que incrementa la variablecontador.
Explica qué comportamiento tendría el programa en ese caso: