Bash 'For' Loop: tutorial i exemples

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 tasques similars diverses vegades. En aquest article, aprendrem a utilitzar el per bucle a Bash.

Introducció

Un script Bash típic conté una sèrie d'ordres que s'executaran una darrere l'altra. Les variables es poden utilitzar per emmagatzemar cadenes, valors d'índex enters, resultats d'una ordre, etc. Els bucles són necessaris quan l'usuari vol executar una ordre determinada diverses vegades. És d'especial utilitat quan la sortida d'una ordre és en forma de llista, i en cada resultat, a la llista, s'ha d'executar una segona ordre.

Sintaxi general

La sintaxi general per per bucle a Bash és:

per a fer ...... fet

Aquí, el és una variable Bash, que ha de ser un nom de variable de l'intèrpret d'ordres Linux vàlid, és a dir, el nom conté una combinació de lletres (az, AZ), números (0-9) i guió baix ( _ ) i ha de començar amb una lletra o un subratllat.

El és un rang personalitzat d'índexs enters que es reproduirà en bucle o una llista personalitzada d'índexs enters o cadenes. També pot contenir una altra ordre de Linux, però, la sortida d'aquesta ordre ha d'estar separada per espais o caràcters de nova línia, és a dir, analitzable per Bash en una llista (una llista a Bash és bàsicament una col·lecció de valors separats per un espai o una nova línia). ).

Qualsevol ordre(s) que s'hagi d'executar s'ha de col·locar dins del fitxer fer... fet bloc.

Vegem uns quants exemples senzills.

Bucle en un rang de valors enters: El codi següent crea directoris anomenats dir1, dir2, dir3 fins a dir10.

per i a {1..10} do mkdir dir$i fet

Recorregut en una llista de valors fixos: El codi següent imprimeix cada cadena o nombre enter a la llista fixada.

per jo a Hola 1 2 3 Adéu! fer ressò $i fet

Bucle a la sortida d'una ordre: El codi següent fa un bucle sobre la sortida de ls i imprimeix el nom de cada fitxer en el format donat.

per i a `ls` fes ressò "El nom del fitxer és $i" fet

Sintaxi basada en expressions

Una sintaxi basada en expressions similar al llenguatge de programació C també és possible a Bash:

per ((Expressió 1; Expressió 2; Expressió 3)) do ... ... fet

Aquí, Expressió 1 és la inicialització de les variables d'índex. Expressió 2 és la condició en què s'ha de sortir del bucle; aquesta condició es verifica en cada iteració. Expressió 3 especifica l'increment/disminució/modificació del valor de les variables d'índex

L'exemple següent només imprimeix valors de 0 a 4:

per ((i=0;i<5;i++)) feu ressò $i fet

L'exemple següent crea un bucle infinit, ja que no s'especifica cap expressió:

per (( ; ; )) fer ressò "Premeu Ctrl-C per aturar" fet

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.

for ((i=0;i<10;i++)) do if [[ $i -eq 5 ]] llavors trenca else echo $i; fi fet

El bucle 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. Per exemple, el bucle següent es trenca si i quan troba un fitxer buit.

per al fitxer a `ls` do flen=`wc -c $fitxer` si [[ "$flen" = "0 $fitxer" ]] llavors echo "$fitxer està buit" break else echo $flen fi fet 

La comanda wc -c imprimeix el nombre de línies del fitxer . Ho imprimeix en el format , per exemple, 10 test.txt. Estem sortint del bucle quan el nombre de línies és 0, és a dir, un fitxer buit.

Continua la declaració per saltar una iteració condicionalment

De manera similar a C i molts altres llenguatges de programació, bash també té un continuar sentència, per saltar la part restant d'una iteració en un bucle si es compleix una condició particular.

for ((i=0;i<10;i++)) do if [[ $i -eq 5 ]] llavors continua fi echo $i; fet

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

En l'exemple següent, imprimim el nombre de línies d'un fitxer i una iteració concreta ho farà continuar si és un directori i no un fitxer.

per al fitxer a `ls` do if [[ -d $fitxer ]] llavors continua fi wc -c "$fitxer" fet

[[ -d $fitxer ]] comprova si el fitxer és un directori. Si és així, passem al fitxer següent, és a dir, a la següent iteració. Si no és un directori, imprimim el nombre de línies del fitxer utilitzant wc comanda, com també es mostra anteriorment.

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

La sintaxi del bucle es pot utilitzar directament a l'intèrpret d'ordres Bash o des d'un fitxer d'script de l'intèrpret d'ordres. Una vegada a per 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 per Loop a Bash és una característica bastant senzilla, però té el seu ús en gairebé tots els tipus d'escenaris de scripting complexos. Aprendre-ho és molt important tant si sou un usuari de Linux normal com avançat, o si comenceu a aprendre l'automatització per a tasques d'Administració del sistema i DevOps.