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

Video - Exemple while

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

Video - Exemple until

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ó

results matching ""

    No results matching ""