Scripturile Bash sunt un mijloc extrem de eficient de automatizare a sarcinilor, în special cele care profită de alte programe existente. Această automatizare necesită adesea repetarea unei operații similare de mai multe ori, exact acolo unde pentru bucla vine în propriul său.
Administratorii de sistem Linux și Mac sunt de obicei familiarizați cu scripturile prin terminal, dar chiar și utilizatorii Windows pot începeți acțiunea cu subsistemul Windows pentru Linux.
Nu aveți nevoie să folosiți Linux fără timp pentru a trece la un alt computer sau a rula o mașină virtuală? Rulați Linux în Windows 10 cu un terminal shell Bash!
Cum funcționează scripturile Bash
Un script bash este pur și simplu un fișier text simplu care conține o serie de comenzi pe care shell-ul bash le poate citi și executa. Bash este shell-ul implicit în pre-Catalina macOS și în majoritatea distribuțiilor Linux.
Dacă nu ați mai lucrat niciodată cu un script shell, ar trebui să începeți cu cel mai simplu caz absolut. Acest lucru vă va permite să practicați concepte cheie, inclusiv crearea scriptului și executarea acestuia.
Mai întâi, creați următorul fișier într-o locație convenabilă (în mod ideal, deschideți un terminal și navigați mai întâi la directorul dorit):
#! / bin / bash
ecou „Bună ziua, lume”
Prima linie spune oricărui program care rulează acest program cum să-l ruleze (adică folosind interpretul bash). A doua este doar o comandă ca oricare alta pe care ați putea să o introduceți pe linia de comandă. Salvați acel fișier ca hello_world.sh, atunci:
$ chmod + x hello_world.sh
$ ./hello_world.sh
chmod comanda din prima linie face ca fișierul să fie executabil, ceea ce înseamnă că poate fi rulat prin introducerea numelui său, ca în linia a doua.
Dacă vedeți cuvintele „Bună ziua, lume” apar tipărite pe o linie în terminalul dvs., atunci totul funcționează după cum este necesar.
Cum funcționează buclele
În programarea generală, există două tipuri principale de bucle pentru: numeric și pentru fiecare. Tipul numeric este în mod tradițional cel mai comun, dar în utilizarea bash-ului, este de obicei invers.
Numeric pentru bucle se concentrează de obicei pe un singur număr întreg care determină câte iterații vor fi efectuate, de exemplu:
pentru (i = 0; i <100; i ++) {
/ * instrucțiuni de executat în mod repetat * /
}
Aceasta este o buclă de căutare familiară, care va itera exact de 100 de ori, cu excepția cazului în care i este modificat în buclă sau dacă o altă instrucțiune determină oprirea executării buclei for.
În schimb, buclele Foreach tind să funcționeze pe structuri precum liste sau tablouri și să itereze pentru fiecare articol din acea colecție:
oameni = ["Petru", "Pavel", "Maria"]
foreach (oameni ca persoană) {
if (person == "Paul") {
...
}
}
Unele limbi folosesc o sintaxă ușor diferită care schimbă ordinea colecției și a articolului:
oameni = ["Petru", "Pavel", "Maria"]
pentru (persoană în oameni) {
if (person == "Paul") {
...
}
}
Pentru în bucle
În bash, foreach - sau pentru în—Bucla este mai frecventă. Sintaxa de bază este, pur și simplu:
pentru arg în [listă]
do
/ * instrucțiuni de executat în mod repetat * /
/ * valoarea arg poate fi obținută folosind $ arg * /
Terminat
De exemplu, pentru a itera prin trei fișiere denumite explicit:
pentru fișier în one.c two.c three.c
do
ls "$ fișier"
Terminat
Dacă astfel de fișiere există în directorul curent, ieșirea din acest script va fi:
one.c
două.c
trei.c
În loc de un set fix de fișiere, lista poate fi obținută printr-un model glob (unul care include metacaracterele - caractere speciale care reprezintă alte caractere). În exemplul următor, bucla for se repetă în toate fișierele (în directorul curent) ale căror nume se termină cu „.xml”:
pentru fișier în * .xml
do
ls -l "$ fișier"
Terminat
Iată câteva exemple de ieșire:
$ -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
Acest lucru poate arăta foarte mult ca un mod de a face cu un aer lung:
$ ls -l * .xml
Dar există o diferență semnificativă: bucla for execută eu sunt programează de 2 ori separate, cu un singur nume de fișier transmis de fiecare dată. În exemplul ls separat, modelul glob (* .xml) se potrivește mai întâi cu numele fișierelor și apoi le trimite pe toate, ca parametri individuali ai liniei de comandă, unei instanțe de eu sunt.
Iată un exemplu care folosește WC (număr de cuvinte) pentru a face diferența mai evidentă:
$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 în total
WC programul numără separat numărul de linii din fiecare fișier, apoi imprimă un număr total pe toate. În schimb, dacă WC operează într-o buclă for:
pentru fișier în * .xml
do
wc -l $ fișier
Terminat
Veți vedea în continuare numărul pentru fiecare fișier:
44 feed.xml
231 sitemap.xml
Dar nu există un rezumat total, deoarece WC este rulat izolat, de fiecare dată când iterați bucla.
Când o listă nu este o listă
Există o greșeală foarte ușoară și obișnuită atunci când se ocupă de bucle, datorită modului în care bash gestionează argumentele / șirurile citate. Parcurgerea unei liste de fișiere ar trebui să se facă astfel:
pentru fișier în one.c two.c
Nu asa:
pentru fișier în „one.c two.c”
Al doilea exemplu cuprinde nume de fișiere între ghilimele duble care rezultă într-o listă cu un singur parametru; bucla for se va executa o singură dată. Această problemă poate fi evitată folosind o variabilă în astfel de cazuri:
FIȘIERE = "one.c two.c"
pentru fișier în $ FILES
do
...
Terminat
Rețineți că declarația variabilă în sine trebuie să-și includă valoarea în ghilimele duble!
Căci Fără listă
Fără nimic de iterat, o buclă for funcționează pe orice argumente din linia de comandă au fost furnizate scriptului atunci când a fost invocat. De exemplu, dacă aveți un script numit args.sh care conține următoarele:
#! / bin / sh
Pentru o
do
ecou $ a
Terminat
Apoi, executarea args.sh vă va oferi următoarele:
$ ./args.sh unu doi trei
unu
Două
Trei
Bash recunoaște acest caz și tratează pentru o do ca echivalent al pentru o în $ @ do unde $ @ este o variabilă specială care reprezintă argumente din linia de comandă.
Emularea unui numeric tradițional pentru buclă
Scripturile Bash se ocupă adesea de liste de fișiere sau linii de ieșire de la alte comenzi, astfel încât pentru tipul de buclă este obișnuit. Cu toate acestea, operația tradițională în stil c este încă acceptată:
pentru ((i = 1; i <= 5; i ++))
do
ecou $ i
Terminat
Aceasta este forma clasică cu trei părți în care:
- o variabilă este inițializată (i = 1) când se întâlnește prima buclă
- bucla continuă atât timp cât condiția (i <= 5) este adevărată
- de fiecare dată în jurul buclei, variabila este incrementată (i ++)
Iterarea dintre două valori este o cerință suficient de comună pentru a exista o alternativă mai scurtă, puțin mai puțin confuză:
pentru i în {1..5}
do
ecou $ i
Terminat
Extinderea bretelei care are loc în mod eficient traduce cele de mai sus pentru buclă în:
pentru i în 1 2 3 4
Control mai bun al buclei cu pauză și continuare
Mai complexe pentru bucle au adesea nevoie de o modalitate de a ieși mai devreme sau de a reporni imediat bucla principală cu următoarea valoare la rândul ei. Pentru a face acest lucru, bash împrumută pauzele și continuă declarațiile care sunt comune în alte limbaje de programare. Iată un exemplu care le folosește pe ambele pentru a găsi primul fișier de peste 100 de caractere:
#! / bin / bash
pentru fișier în *
do
dacă [! -f "$ fișier"]
atunci
ecou „$ fișier nu este un fișier”
continua
fi
num_chars = $ (wc -c fișierul echo $ are „$ num_chars caractere”
dacă [$ num_chars -gt 100]
atunci
ecou „Fișier $ găsit”
pauză
fi
Terminat
Bucla for operează aici pe toate fișierele din directorul curent. Dacă fișierul nu este un fișier obișnuit (de exemplu, dacă este un director), declarația continue este utilizată pentru a reporni bucla cu următorul fișier la rândul său. Dacă este un fișier obișnuit, al doilea bloc condițional va determina dacă conține mai mult de 100 de caractere. Dacă da, instrucțiunea break este utilizată pentru a părăsi imediat bucla for (și a ajunge la sfârșitul scriptului).
Concluzie
Un script bash este un fișier care conține un set de instrucțiuni care pot fi executate. O buclă for permite ca o parte a unui script să fie repetată de multe ori. Cu ajutorul variabilelor, comenzilor externe și instrucțiunilor break și continue, scripturile bash pot aplica o logică mai complexă și pot efectua o gamă largă de sarcini.
Raportul sugerează că etichetele de confidențialitate ale aplicației Apple pot avea unele probleme.
- Programare
- Linux

Bobby este un pasionat de tehnologie care a lucrat ca dezvoltator de software timp de aproape două decenii. Este pasionat de jocuri, lucrează ca editor de recenzii la Switch Player Magazine și este cufundat în toate aspectele publicării online și dezvoltării web.
Aboneaza-te la newsletter-ul nostru
Alăturați-vă newsletterului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!
Încă un pas…!
Vă rugăm să confirmați adresa de e-mail în e-mailul pe care tocmai vi l-am trimis.