Bucle 'While' de Bash: tutorial i exemples

Utilitzant el bucle "while" a les seqüències d'ordres Bash per iterar sobre les ordres.

Bash (Bourne Again Shell) és un indicador d'ordres de l'intèrpret d'ordres i un llenguatge de script als sistemes operatius GNU/Linux. És el shell predeterminat per a la majoria de distribucions de Linux.

Com la majoria dels llenguatges de script, Bash proporciona sintaxis de bucle per repetir una tasca similar diverses vegades. En aquest article aprendrem a utilitzar el mentre bucle a Bash.

Introducció

El mentre Loop a Bash s'utilitza per executar ordres (ordres executades) diverses vegades en funció de la sortida d'altres ordres (ordres de condició). Les ordres executades continuaran executant-se fins que l'ordre de condició s'executi correctament (és a dir, retorna un estat 0. Qualsevol ordre a Linux retorna 0 per a l'èxit i un nombre enter diferent de zero per a la fallada).

Si hi ha diverses ordres de condició, la instrucció considera només l'estat de l'última ordre de la llista, és a dir, el bucle s'executa fins que l'última ordre de la llista s'executa correctament.

Sintaxi general

La sintaxi general per mentre bucle a Bash és:

mentre es fa

La llista d'ordres d'execució continuarà executant-se fins que l'última ordre de la llista d'ordres de condició s'executi correctament i surt amb l'estat 0. En la iteració, quan falla l'ordre de l'última condició, el bucle surt.

L'usuari pot especificar qualsevol fitxer executable a les llistes d'ordres. Pot ser programes Linux estàndard o programes d'usuari o scripts personalitzats. Cada comanda hauria d'estar en una línia nova o separada per un punt i coma a la mateixa línia.

Vegem-ne uns quants exemples.

Bucle fins que una variable tingui un valor particular: El següent bucle s'executa fins al valor de la variable x no és igual a 10.

x=0 mentre que [[ $x -ne 10 ]] fa ressò $x ((x++)) fet

En cada iteració, estem comprovant si el valor de x és 10. El valor s'està comprovant amb el prova comandament. [[ Expressió ]] és la sintaxi de l'ordre de prova (vegeu prova d'home). Aquí ja que estem utilitzant el -ne operador (que significa "no igual a"), l'ordre de prova retorna 0, és a dir, èxit, si el valor de x no és 10, i retorna un valor diferent de zero, és a dir, error si el valor de x és 10.

Després dins del fer... fet bloc, imprimim el valor de x i l'incrementem. Un cop el valor de x és 10, l'ordre de prova retorna un estat diferent de zero i el bucle surt.

Nota: La variable d'índex que s'utilitzarà al bucle while s'ha d'inicialitzar abans del bucle while o a les ordres de condició, a diferència del bucle for, que permet inicialitzar una variable implícitament.

Amb diverses ordres de condició: El següent bucle crea 5 directoris anomenats dir0, dir1, ... dir4.

z=0 while echo "Llista de fitxers:" ls -l [[ $z -ne 5 ]] do echo "S'està creant dir$z..." mkdir dir$z ((z++)) fet

Primeres ordres echo "Llista de fitxers:" i ls -l s'executarà una vegada completament; el seu èxit o fracàs no té cap impacte en el temps que durarà el bucle.

Aleshores s'executarà l'ordre de prova per comprovar el valor de la variable z. Fins que el valor de z no sigui 5, l'ordre de prova retorna l'estat d'èxit i, per tant, el bucle continua funcionant. Les ordres de condició i les ordres executades es mantenen en ordre. Aquí, per a cada iteració, primer executarà l'ordre echo i l'ordre ls en condicions i després l'ordre de la tercera condició comprovarà el valor de z. Si no és 5, entra al bucle i executa les ordres donades.

Trenca i continua

Declaració de pausa per a la sortida condicional

També podem utilitzar l'enunciat condicional si dins del bucle. El si La declaració es pot utilitzar amb a trencar sentència, per a una sortida condicional del bucle.

x=0 mentre que [[ $x -ne 10 ]] fa si [[ $x -eq 5 ]] break fi echo $x ((x++)) fet

El bucle while anterior imprimirà números del 0 al 4. Aleshores, quan el valor de i sigui 5, sortirà del bucle. Això és especialment útil quan s'ha de sortir d'un bucle quan una ordre dóna una sortida específica.

Continua la declaració per saltar una iteració condicionalment

Bash també té un continuar sentència, per saltar la part restant d'una iteració en un bucle si es compleix una condició particular.

x=0 mentre que [[ $x -ne 10 ]] ho fa si [[ $x -eq 5 ]] continua fi echo $x ((x++)) fet

El bucle anterior imprimirà números del 0 al 10, excepte el 5, perquè durant la iteració de x=5 hi ha una instrucció continue, que saltarà la resta del codi en el bucle al començament amb la iteració de x=6.

Ús de bucles: scripts i línia d'ordres

Les sintaxis de bucle es poden utilitzar a l'intèrpret d'ordres Bash directament o des d'un fitxer de script d'intèrpret d'ordres executable. Similar a per i mentre bucles, una vegada a mentre La sintaxi de bucle s'introdueix a l'intèrpret d'ordres, l'intèrpret d'ordres continua l'indicador per permetre que l'usuari continuï les ordres que s'han de reproduir en bucle.

O bé, l'usuari pot desar-ho en un fitxer d'script i executar-lo.

El #!/bin/bash al començament especifica l'intèrpret que s'utilitzarà quan s'executa el fitxer. Tot i que Bash és l'intèrpret d'ordres més utilitzat avui dia, alguns usuaris prefereixen shells com zsh, que s'hauria d'especificar en lloc de bash a l'inici d'aquest fitxer.

Per donar permisos d'execució per a aquest fitxer, executeu:

chmod +x prova.sh

Finalment, per executar el fitxer, correr:

./prova.sh

Conclusió

El mentre bucle, semblant a per i fins que els bucles són una característica important en els scripts de Bash. Mentre que el bucle té un ús similar al bucle fins, excepte que s'utilitza per executar ordres/programes alternatius quan un programa determinat té èxit. Això sovint troba la seva utilitat en scripts de xarxa avançats, scripts de manteniment del sistema, etc.