Tot el que heu de saber sobre Bash for Loops a Linux

Tot el que heu de saber sobre Bash for Loops a Linux

Els scripts Bash són un mitjà altament eficient per automatitzar tasques, especialment aquelles que aprofiten altres programes existents. Aquesta automatització sovint requereix repetir una operació similar diverses vegades, que és precisament el lloc on per a bucle entra en el seu propi.





Els administradors de sistemes Linux i Mac solen familiaritzar-se amb la creació de scripts a través del terminal, però fins i tot els usuaris de Windows poden fer-ho iniciar l'acció amb el subsistema Windows per a Linux .





Com funcionen els scripts de Bash

Un script bash és simplement un fitxer de text pla que conté una sèrie d’ordres que el shell bash pot llegir i executar. Bash és l'intèrpret d'ordres predeterminat a macOS pre-Catalina i a la majoria de distribucions de Linux.





Si mai no heu treballat mai amb un script de shell, hauríeu de començar amb el cas més senzill i absolut. Això us permetrà practicar conceptes clau, inclosa la creació de l'script i la seva execució.

Primer, creeu el fitxer següent en una ubicació convenient (idealment, obriu un terminal i aneu al directori desitjat primer):



#!/bin/bash
echo 'Hello, World'

La primera línia indica a qualsevol que executi aquest programa com s’executa (és a dir, mitjançant l’intèrpret bash). El segon és només una ordre com qualsevol altra que podeu introduir a la línia d'ordres. Deseu aquest fitxer com a hello_world.sh , llavors:

$ chmod +x hello_world.sh
$ ./hello_world.sh

El chmod L'ordre de la primera línia fa executable el fitxer, és a dir, que es pot executar escrivint el seu nom, com a la segona línia.





Si veieu les paraules Hola, món apareixen impreses en una línia del vostre terminal, tot funcionarà segons sigui necessari.

Com funciona el bucle

En la programació general, hi ha dos tipus principals de bucle for: numèric i per cadascú . El tipus numèric és tradicionalment el més comú, però en l’ús bash sol ser al revés.





El numèric per a bucles normalment se centra en un únic enter que determina quantes iteracions es duran a terme, per exemple:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Es tracta d'un bucle de cerca familiar que iterarà exactament 100 vegades, tret que s'alteri i dins del bucle, o si una altra sentència fa que s'executi el bucle for.

Per contra, els bucles Foreach tendeixen a funcionar en estructures com ara llistes o matrius, i s'itereixen per a cada element d'aquesta col·lecció:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Alguns idiomes fan servir una sintaxi lleugerament diferent que canvia l'ordre de col·lecció i d'ítem:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

Per a bucles

A bash, el foreach, o per a —La bucle és més freqüent. La sintaxi bàsica és, simplement:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Per exemple, per recórrer tres fitxers de nom explícit:

quant costa Kindle il·limitat
for file in one.c two.c three.c
do
ls '$file'
done

Si aquests fitxers existeixen al directori actual, la sortida d’aquest script serà:

one.c
two.c
three.c

En lloc d'un conjunt fix de fitxers, la llista es pot obtenir mitjançant un patró glob (un inclòs comodins, caràcters especials que representen altres caràcters). A l'exemple següent, el bucle for itera a tots els fitxers (al directori actual) els noms dels quals acaben en '.xml':

for file in *.xml
do
ls -l '$file'
done

Aquí teniu alguns exemples de sortida:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Pot semblar una manera de fer amb molt de temps:

$ ls -l *.xml

Però hi ha una diferència significativa: el bucle for executa el fitxer ls programa 2 vegades per separat, amb un únic nom de fitxer que se li passa cada vegada. A l'exemple separat de ls, el patró glob (* .xml) coincideix primer amb els noms de fitxer i després els envia tots, com a paràmetres de línia d'ordres individuals, a una instància de ls .

Aquí teniu un exemple que utilitza el fitxer wc (recompte de paraules) per fer més evident la diferència:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

El wc programa compta el nombre de línies de cada fitxer per separat i, a continuació, imprimeix un recompte total de totes. En canvi, si wc opera dins d'un bucle for:

for file in *.xml
do
wc -l $file
done

Encara veureu el recompte de cada fitxer:

44 feed.xml
231 sitemap.xml

Però no hi ha un resum global perquè wc s'executa de forma aïllada, cada vegada que el bucle itera.

Quan una llista no és una llista

Hi ha un error molt fàcil i comú quan es tracta de bucles, a causa de la manera com bash gestiona els arguments / cadenes citats. Cercar una llista de fitxers s'ha de fer així:

for file in one.c two.c

No així:

for file in 'one.c two.c'

El segon exemple inclou noms de fitxer entre cometes dobles que donen lloc a una llista amb només un paràmetre únic; el bucle for només s'executarà una vegada. Aquest problema es pot evitar utilitzant una variable en aquests casos:

FILES='one.c two.c'
for file in $FILES
do
...
done

Tingueu en compte que la declaració de variables necessita incloure el seu valor entre cometes dobles.

Com pots saber si algú et va bloquejar a Snapchat?

Per a Sense llista

Sense res a recórrer, un bucle for funciona en qualsevol argument de línia de comandes que es proporcionés a l'script quan es va invocar. Per exemple, si teniu un script anomenat args.sh que conté el següent:

#!/bin/sh
for a
do
echo $a
done

A continuació, executant args.sh us proporcionarà el següent:

$ ./args.sh one two three
one
two
three

Bash reconeix aquest cas i tracta per fer com a equivalent de per un $ @ do on $ @ és una variable especial que representa arguments de línia d'ordres.

Emulació d'un numèric tradicional per a bucle

Els scripts Bash solen tractar amb llistes de fitxers o línies de sortida d'altres ordres, de manera que el for in tipus de bucle és comú. Tanmateix, l'operació tradicional d'estil c encara és compatible:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Aquesta és la forma clàssica amb tres parts en què:

  1. s'inicialitza una variable (i = 1) quan es troba el bucle per primera vegada
  2. el bucle continua mentre la condició (i<=5) is true
  3. cada vegada al voltant del bucle, la variable s'incrementa (i ++)

La iteració entre dos valors és un requisit prou comú perquè hi hagi una alternativa més curta, una mica menys confusa:

for i in {1..5}
do
echo $i
done

L'expansió de claus que té lloc de manera efectiva es tradueix l'anterior per a bucle en:

for i in 1 2 3 4

Control de bucle més fi amb Break and Continue

Més complexos per a bucles sovint necessiten una manera de sortir aviat o reiniciar immediatament el bucle principal amb el següent valor al seu torn. Per fer-ho, bash pren les instruccions break i continue que són habituals en altres llenguatges de programació. Aquí teniu un exemple que utilitza tots dos per trobar el primer fitxer de més de 100 caràcters:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

El bucle for funciona aquí a tots els fitxers del directori actual. Si el fitxer no és un fitxer normal (per exemple, si es tracta d’un directori), la instrucció continue s’utilitza per reiniciar el bucle amb el següent fitxer al seu torn. Si es tracta d’un fitxer normal, el segon bloc condicional determinarà si conté més de 100 caràcters. Si és així, la sentència break s'utilitza per deixar immediatament el bucle for (i arribar al final de l'script).

Conclusió

Un script bash és un fitxer que conté un conjunt d'instruccions que es poden executar. Un bucle for permet que una part d'un script es pugui repetir moltes vegades. Amb l'ús de variables, ordres externes i instruccions break and continue, els scripts bash poden aplicar una lògica més complexa i dur a terme una àmplia gamma de tasques.

Compartir Compartir Tweet Correu electrònic Val la pena actualitzar-lo a Windows 11?

Windows s’ha redissenyat. Però, n’hi ha prou per convèncer-vos de canviar de Windows 10 a Windows 11?

Llegiu a continuació
Temes relacionats
  • Programació
  • Linux
Sobre l'autor Bobby Jack(58 articles publicats)

Bobby és un entusiasta de la tecnologia que va treballar com a desenvolupador de programari durant gairebé dues dècades. És un apassionat dels jocs, treballa com a editor de ressenyes a Switch Player Magazine i està immers en tots els aspectes de la publicació en línia i el desenvolupament web.

Més de Bobby Jack

Subscriu-te al nostre butlletí

Uniu-vos al nostre butlletí per obtenir consells tècnics, ressenyes, llibres electrònics gratuïts i ofertes exclusives.

Feu clic aquí per subscriure-us