Introducció
Les instruccions repetitives o iteratives ens permeten realitzar un conjunt d'instruccions un determinat número de vegades. En el llenguatge bash hi ha 3 formats bàsics de iteració
bash - while loop
El bucle "while" té com a finalitat realitzar una sèrie d'instruccions mentre la condició sigui true. El format de la instrucció és:
while [ condició ]
do
sentencia 1
sentencia 2
...
done
Els criteris de construcció de la condició són els mateixos que en les sentències condicionals.
Nota: Recordar deixar un espai entre els [ ] i la condició.
Exemple
#!/bin/bash
i=1
while [ $i -le 3 ]
do
echo "Iteració $i"
i=$((i+1))
done
bash - until loop
El bucle "until" (fins que) és molt semblant al "while" (mentre), amb la diferència que les sentències es repeteixen mentre la condició és falsa o bé fins que la condició sigui certa
until [ condició ]
do
sentencia 1
sentencia 2
...
done
Until i while són totalment intercanviables: tant puc utilitzar una expressió com l'altre. L'única cosa que hauré de fer és canviar la condició en un i altre cas. Aquest fet es dóna també en el llenguatge natural. Mentre NO arribi l'autobús => espera Fins que arribi l'autobús => espera
#!/bin/bash
i=1
until [ $i -gt 3 ]
do
echo "Iteració $i"
i=$((i+1))
done
bash - for loop
El bucle for té 2 possibilitats diferents: recòrrer els elements d'una llista o recòrrer un rang de valors
Recòrrer els elements d'una llista
En bash una llista és un conjunt d'elements separats per un espai en blanc. Així, per exemple: "bici cotxe moto camió" és una llista. Amb el bucle "for" podem accedir a cada un d'aquests elements. El format de la sintaxis loop és:
for var in list
do
sentencia 1
sentencia 2
...
done
Cada un dels valors continguts a llista s'emmagatzema en la variable que hem anomenat "var".
Exemple
list="1 2 3"
for num in $list
do
echo "Iteració $num"
done
Video - Exemple for amb llista de valors
Utilització de rangs
Amb la sentència for podem recòrrer tots els valors enters compresos entre un rang de valors enters. Per a indicar un rang utilitzem el símbol de les claus, on el primer valor serà el valor inicial del rang i l'últim valor serà el valor final. Separem els dos números mitjançant 2 punts (..) .
for num in {inicial..final}
do
sentencia 1
sentencia 2
...
done
Si el valor inicial és més gran que el valor final, els valors associats a la variable "num" seran creixents, per contra, podem invertir el rang i fer un rang decreixent si el valor associat a final és inferior al valor associat a inicial.
Una característica adicional que ens permet l'especificació del rang és l'increment/decrement que es vol realitzar. En aquest cas, després del nombre "final" afegirem dos punts més (..) i especificarem el número amb què volem variar.
Format complet de rang: {inicial..final..increment}
El valor associat a increment el podem indicar sempre com a nombre positiu, encara que el rang sigui decreixent.
Exemple
for num in {1..3}
do
echo "Iteració $num"
done
for num in {3..1}
do
echo "Iteració $num"
done
for num in {8..1..2} # Decrement en 2 unitats
do
echo "Iteració $num"
done
Recòrrer fitxers
És usual utilitzar la sentència for per a recòrrer tots els fitxers que hi ha en un directori. El codi que hem d'utilitzar és:
#!/bin/bash
for file in ./* # iterate each element contained in list variable
do
echo "Fitxer $file"
done
Video - Exemple for amb rang de valors
continue i break
Les instruccions continue i break ens permeten modificar el flux d'execució de la comanda for. Tot i que aquestes instruccions puguin ser útils, cal minimitzar la seva utilització, ja que dificulten la lectura i comprensió del codi . Per tant , les utilitzarem només en aquells casos que sigui imprescindible.
break
Quan s'executa la sentència break es finalitza l'execució del bucle actual. El programa es continua executant en el següent bucle.
for num in {1..3}
do
echo "Iteració $num"
break
done
echo "Continua l'execució"
En l'exemple anterior, el programa només imprimirà:
Iteració 1
Continua l'execució
Ja que la sentència "break" força la finalització del bucle d'iteració.
continue
La sentència continue finalitza l'execució del bucle per l'element actual, però enlloc de finalitzar el bucle i executar la següent instrucció després del bucle, es passa a executar el següent element del bucle.
for num in {1..3}
do
if [ $num -eq 2 ]
then
continue
fi
echo "Iteració $num"
done
echo "Continua l'execució"
En l'exemple anterior, el programa només imprimirà:
Iteració 1
Iteració 3
Continua l'execució
Video - Exemple for amb rang de valors
python - while loop
El bucle "while" té com a finalitat realitzar una sèrie d'instruccions mentre la condició sigui true. El format de la instrucció és:
sentencia1.1
...
while condició:
sentencia 2.1
sentencia 2.2
...
sentencia 1.N
La sintaxis aplicada a la condició és la mateixa que utilitzem per a les sentències condicionals.
Exemple
#!/usr/bin/env python3
i=1
while i<=3:
print("Iteration",i)
i=i+1
print("End while!")
python - until loop
El llenguatge Python no disposa de l'estructura until. En aquest cas, haurem d'adaptar la instrucció "until" de bash a l'estructura de "while".
python - for loop
El bucle for té 2 possibilitats diferents: recòrrer els elements d'una llista o recòrrer un rang de valors
Recòrrer els elements d'una llista
Les llistes en Python es generen incloent els elements entre clàudators. Cada un dels elements es separen amb comes (,). Cal tenir en compte que una llista pot contenir elements de diferents tipus o fins i tot, un element pot ser una llista en si mateix.
Format llista : [el1, el2, ... , elN] . Si els elements són cadenes de caràcters, cal utilitzar cometes simples o dobles.
#!/usr/bin/env python3
list=["Element1",2,"Element3"]
for i in list:
print("Iteració",i)
print("End for!")
Recòrrer un rang de valors
Per a recòrrer tots els valors numèrics enters que hi ha entre un rang de números hem d'utilitzar la funció "range" de Python. El format de la funció és:
range([inici], final[, increment])
Com es pot deduir de la sintaxis, el valor inici i increment són opcionals. Els valors per defecte d'aquests dos paràmetres, si no s'especifiquen són:
- inici : zero (0)
- increment : 1
Així, l'expressió range(3), genera tots els valors entre 0 i 2.
Exemple
#!/usr/bin/env python3
for num in range(3): # Valors: 0,1,2
print("Iteració",num)
print() # Afegir línia en blanc!
for num in range(0,3): # Valors: 0,1,2
print("Iteració",num)
print()
for num in range(0,8,2): # Increment en 2 unitats 0,2,4,6
print("Iteració",num)
print()
for num in range(8,0,-2): # Decrement en 2 unitats 8,6,4,2
print("Iteració",num)
Recòrrer fitxers
Per a recòrrer tots els fitxers i directoris podem utilitzar el mètode "listdir" de la llibreria "os" de Python. Aquesta comanda ens retorna tots els fitxers i directoris continguts dins el directori especificat al mètode "listdir". Podem utilitzar la instrucció "for" per a recòrrer cada un dels elements de la llista.
#!/usr/bin/env python3
import os
files=os.listdir("/etc")
for file in files:
print(file)
continue i break
Les instruccions continue i break ens permeten modificar el flux d'execució de la comanda for. Tot i que aquestes instruccions puguin ser útils, cal minimitzar la seva utilització, ja que dificulten la lectura i comprensió del codi . Per tant , les utilitzarem només en aquells casos que sigui imprescindible.
break
Quan s'executa la sentència break es finalitza l'execució del bucle actual. El programa es continua executant en el següent bucle.
#!/usr/bin/env python3
for num in range(3): # Valors: 0,1,2
print("Iteració",num)
break # Finalitza el bucle
print("Continua l'execució")
En l'exemple anterior, el programa només imprimirà:
Iteració 1
Continua l'execució
Ja que la sentència "break" força la finalització del bucle d'iteració.
continue
La sentència continue finalitza l'execució del bucle per l'element actual, però enlloc de finalitzar el bucle i executar la següent instrucció després del bucle, es passa a executar el següent element del bucle.
#!/usr/bin/env python3
for num in range(3): # Valors: 0,1,2
if num==1:
continue # Continuar execució pel següent element
print("Iteració",num)
En l'exemple anterior, el programa només imprimirà:
Iteració 1
Iteració 3
Continua l'execució