9 Exemple de bucle for în scripturile Linux Bash
Publicat: 2022-08-19 Versatilul Bash for
loop face mult mai mult decât buclă în jurul unui anumit număr de ori. Vă descriem numeroasele sale variante, astfel încât să le puteți utiliza cu succes în propriile scripturi Linux.
Bucla pentru
Toate limbajele de scriptare și programare au o modalitate de a gestiona buclele. O buclă este o secțiune de cod pe care doriți să o executați în mod repetat. În loc să tastați același set de instrucțiuni în script-ul dvs., din nou și din nou, o buclă va repeta o secțiune de cod din nou și din nou pentru dvs.
Bucla Bash for
este foarte flexibilă. Poate funcționa cu numere, cuvinte, matrice, variabile din linia de comandă sau cu rezultatul altor comenzi. Acestea sunt folosite în antetul buclei. Antetul dictează cu ce funcționează bucla - numere sau șiruri, de exemplu - și care este condiția finală care va opri bucla.
Corpul buclei conține codul pe care doriți să îl repetați. Ține ceea ce vrei să facă bucla. Corpul buclei poate conține orice comandă de script validă.
O variabilă numită contor de bucle sau iterator este utilizată pentru a parcurge o serie de valori sau o listă de elemente de date. Pentru fiecare buclă, iteratorul preia valoarea următorului număr, șir sau orice tip de date peste care iterează bucla. Acest lucru permite buclei să lucreze cu valorile fiecăruia dintre elementele de date pe rând sau chiar, în unele cazuri, să manipuleze elementele de date în sine.
Simplu pentru bucle
Dacă doriți să scrieți prima buclă for, aceste exemple simple vă vor ajuta să începeți.
pentru bucle folosind liste numerice
Puteți rula o buclă for
pe linia de comandă. Această comandă creează și execută o buclă for
simplă. Iteratorul este o variabilă numită i
. Vom atribui i
să fie fiecare dintre valorile din lista de numere, pe rând. Corpul buclei va imprima acea valoare în fereastra terminalului. Condiția care încheie această buclă este atunci când i
repetat întreaga listă de numere.
pentru i în 1 2 3 4 5; face eco $i; Terminat
Este important de remarcat aici că variabila i
este crescută cu una de fiecare dată când bucla se rotește, dar asta pentru că lista de numere crește cu una de fiecare dată.
Această listă de numere începe de la 3 și crește în pași de doi, apoi sare în mod arbitrar la 44.
pentru i în 3 5 7 9 11 44; face eco $i; Terminat
Nu are nicio diferență for
. Începe la un capăt al listei și folosește fiecare valoare pe rând, până când toate valorile din listă au fost folosite.
Nici numerele nu trebuie să fie în ordine crescătoare. Ele pot fi în orice ordine.
pentru i în 3 43 44 11 9; face eco $i; Terminat
pentru bucle folosind liste de cuvinte
La fel de ușor putem face același lucru cu cuvintele. Copiați textul scriptului într-un editor și salvați-l ca „word-list.sh”.
#!/bin/bash pentru cuvânt în Aceasta este o succesiune de cuvinte do eco $cuvânt Terminat
Va trebui să utilizați chmod
pentru a face scriptul executabil și orice alt script pe care îl copiați din acest articol. Doar înlocuiți numele scriptului de fiecare dată când utilizați comanda chmod
.
chmod +x lista de cuvinte.sh
Să rulăm scriptul.
./listă-cuvinte.sh
Așa cum a făcut cu numerele, iteratorul - în acest exemplu, word
variabil - își parcurge lista de elemente de date până când ajunge la sfârșitul listei. Corpul buclei accesează valoarea din variabila word
și astfel fiecare cuvânt din listă este procesat.
pentru bucle cu intervale de numere
Dacă doriți ca o buclă for
să ruleze de 100 de ori, ar fi o afacere destul de obositoare să trebuiască să tastați o secvență de 100 de numere în antetul buclei. Intervalele de numere vă permit să specificați numai primul și ultimul număr.
Acest script este „number-range.sh”.
#!/bin/bash pentru i în {1..10} do echo "Rotire buclă:" $i Terminat
Intervalul de numere este definit între paranteze „ {}
” cu două puncte „ ..
” care separă numerele care încep și se termină intervalul. Asigurați-vă că nu includeți niciun spațiu alb în definiția intervalului.
Acesta este modul în care funcționează:
./number-range.sh
Puteți include un alt număr care definește dimensiunea pasului pe care iteratorul ar trebui să o folosească pentru a parcurge numerele din interval. Acest script, „number-range2.sh” va folosi un interval de la 0 la 32 și o dimensiune a pasului de 4.
#!/bin/bash pentru i în {0..32..4} do echo "Rotire buclă:" $i Terminat
Iteratorul parcurge intervalul de numere în salturi de patru.
./number-range2.sh
pentru bucle folosind nume de fișiere
Deoarece putem procesa liste de cuvinte, putem face ca scripturile noastre să lucreze cu nume de fișiere. Acest script se numește „filenames.sh”.
#!/bin/bash pentru fișierul din lista de cuvinte.sh număr-gamă.sh număr-gamă2.sh nume fișiere.sh do ls -lh "$fișier" Terminat
Ar fi destul de inutil să aveți un script care face doar ceea ce poate face ls
, dar demonstrează cum să accesați numele fișierelor în corpul buclei.
./filenames.sh
Într-un mod similar cu utilizarea intervalului de numere, putem folosi un model de fișier în antetul buclei pentru a specifica fișierele pe care dorim să le procesăm. Acest lucru evită multă tastare și înseamnă că nu trebuie să știm în prealabil numele fișierelor.
Acest script se numește „filenames2.sh”. Am înlocuit lista de nume de fișiere cu modelul de nume de fișier „*.sh” pentru a avea raportul de script pentru toate fișierele de script din directorul curent.
#!/bin/bash pentru fișier în *.sh do ls -lh "$fișier" Terminat
Iată rezultatul.
./filenames2.sh
pentru bucle folosind parametrii liniei de comandă
Putem adăuga mai multă flexibilitate prin introducerea modelului de nume de fișier pe linia de comandă. Variabila $*
reprezintă toți parametrii liniei de comandă trecuți scriptului.
Acesta este „filenames3.sh”.
#!/bin/bash pentru fișier în $* do ls -lh "$fișier" Terminat
Vom cere nume de fișiere care încep cu „n” și au extensia SH.
./filenames3.sh n*.sh
De asemenea, putem trece în mai multe modele la un moment dat.
./filenames3.sh n*.sh .bashrc
file
variabilă iterator preia valoarea fiecăruia dintre parametrii liniei de comandă. Modelele de nume de fișiere sunt extinse și toate numele de fișiere sunt procesate în corpul buclei.
LEGATE: Cum să lucrați cu variabile în Bash
C-like for Loops
Bash acceptă bucla clasică pentru trei termeni, cum ar fi cele găsite în limbajul de programare C. Se numesc bucle for cu trei termeni, deoarece există trei termeni în antetul buclei.
- Valoarea inițială a iteratorului buclei.
- Testul dacă bucla continuă sau se termină.
- Incrementarea – sau decrementarea – a iteratorului.
Acest script este „c-like.sh”.
Iteratorul I
este setat la 1 la începutul buclei, iar bucla va rula atâta timp cât declarația „ i<=10
” este adevărată. De îndată i
ajung la 11, bucla for
se va opri. Iteratorul este crescut cu unul, la fiecare revoluție a buclei.
#!/bin/bash pentru (( i=1; i<=10; i++ )) do echo "Numărul buclei:" $i Terminat
Să rulăm acest script.
./c-ca.sh
Bucla for
de tip C permite crearea ușoară a buclelor for
care au cerințe puțin ciudate. Această buclă începe la 15 și se numără înapoi în pași de 3. Acesta este „c-like2.sh”
#!/bin/bash pentru (( i=15; i>0; i-=3 )) do echo "Numărul buclei:" $i Terminat
Când îl rulăm, ar trebui să sară înapoi în pași de trei.
./c-like2.sh
Infinit pentru bucle
De asemenea, puteți utiliza acest format de buclă for
a crea o buclă infinită. Tot ce trebuie să faceți este să eliminați toate elementele din antetul buclei, așa. Acesta este „infinite.sh”.
#!/bin/bash pentru (( ; ; )) do echo „Apăsați Ctrl+C pentru a opri...” somn 1 Terminat
Va trebui să apăsați Ctrl+C pentru a opri bucla.
./infinit.sh
pentru bucle folosind matrice de cuvinte
Putem repeta cu ușurință printr-o serie de cuvinte. Trebuie să furnizăm numele matricei în antetul buclei, iar iteratorul va parcurge toate intrările din matrice. Acesta este „word-array.sh”.
#!/bin/bash distribuții=(„Ubuntu Fedora Manjaro Arch EndeavourOS Garuda”) pentru distro în $distributions do echo $distro Terminat
Toate distribuțiile sunt listate pentru noi.
./word-array.sh
Comanda continua
Dacă doriți ca bucla să treacă peste o anumită intrare, testați dacă iteratorul se potrivește cu acea intrare și utilizați comanda continue
. Comanda continue
abandonează rotirea curentă a buclei. Incrementează iteratorul și începe următoarea rotire a buclei - presupunând că intrarea pe care doriți să o săriți nu este ultimul element din listă.
Acesta este „word-array2.sh”. Trece peste intrarea matricei „Arch”, dar procesează toți ceilalți membri ai matricei.
#!/bin/bash distribuții=(„Ubuntu Fedora Manjaro Arch EndeavourOS Garuda”) pentru distro în $distributions do if [[ "$distro" == "Arch" ]] ; apoi continua fi echo $distro Terminat
„Arch” nu apare în fereastra terminalului.
./word-array2.sh
Comanda de pauză
Comanda break
iese din buclă și previne orice procesare.
Acesta este „word-array3.sh”. Este același cu scriptul anterior, cu continue
înlocuit cu break
.
#!/bin/bash distribuții=(„Ubuntu Fedora Manjaro Arch EndeavourOS Garuda”) pentru distro în $distributions do if [[ "$distro" == "Arch" ]] ; apoi pauză fi echo $distro Terminat
Când iteratorul conține „Arch”, bucla for abandonează orice procesare.
./word-array3.sh
pentru bucle folosind tablouri asociative
În Bash 4 și versiuni ulterioare, tablourile asociative vă permit să creați liste de perechi cheie-valoare care pot fi căutate după cheie sau după valoare. Din cauza relației bidirecționale dintre cheie și valoare, ele mai sunt numite și dicționare de date.
Putem itera printr-o matrice asociativă folosind o buclă for
. Acest script este „associative.sh”. Acesta definește o matrice asociativă cu patru intrări în ea, câte una pentru fiecare dintre „câine”, „pisică”, „robin” și „om”. Acestea sunt cheile. Valorile sunt numărul (implicit) de picioare pe care le are fiecare.
#!/bin/bash declare -A animals=( [câine]=Patru picioare [pisică]=Patru picioare [robin]=Două picioare [uman]=Două picioare) pentru picioare în ${!animals[@]} do if [ ${animals[$picioare]} == „Cu două picioare” ]; apoi echo ${picioare} fi Terminat
Iteratorul se numește legs
. Rețineți că antetul buclei conține un „ !
" semn de exclamare. Acesta nu acționează ca operator logic NOT, ci face parte din sintaxa matricei asociative. Este necesar să căutați prin matrice.
Corpul buclei efectuează un test de comparare a șirurilor. Dacă valoarea membrului matricei este „Two-legged”, se tipărește valoarea cheii în fereastra terminalului. Când îl rulăm, scenariul imprimă creaturile cu două picioare.
./asociativ.sh
Iterarea peste rezultatul comenzilor
Dacă aveți o comandă sau o secvență de comenzi care generează o listă de ceva, cum ar fi numele de fișiere, le puteți itera cu o buclă for
. Trebuie să fiți atenți la extinderile neașteptate ale numelor de fișiere, dar în cazuri simple este bine.
Acest script este „command.sh”. folosește ls
și wc
pentru a furniza o listă sortată de nume de fișiere script, împreună cu numărul lor de linii, cuvinte și octeți.
#!/bin/bash pentru i în $(ls *.sh | sort); do echo $(wc $i) Terminat
Când îl rulăm, obținem statisticile pentru fiecare fișier, cu fișierele enumerate în ordine alfabetică.
./comandă.sh
The Dazzling for Loop
Bucla for
este un instrument de scripting versatil și ușor de înțeles. Dar oricât de flexibil este, nu uitați că există și alte bucle cu un motiv. Nu fi uimit să crezi că bucla for
este tot ce vei avea nevoie.
Bucla while
, de exemplu, este mult mai potrivită pentru anumite lucruri decât bucla for
, cum ar fi citirea liniilor dintr-un fișier.
A scrie scripturi bune înseamnă a folosi instrumentul cel mai potrivit pentru sarcina în cauză. Bucla for
este un instrument grozav pe care trebuie să-l ai în trusa ta de instrumente.