Bucla „For” Bash: tutorial și exemple

Bash (Bourne Again Shell) este un prompt de comandă shell și un limbaj de scripting în sistemele de operare GNU/Linux. Este shell-ul implicit pentru majoritatea distribuțiilor Linux.

La fel ca majoritatea limbajelor de scripting, Bash oferă sintaxe bucle pentru a repeta sarcini similare de mai multe ori. În acest articol, vom învăța cum să folosim pentru buclă în Bash.

Introducere

Un script Bash tipic conține o serie de comenzi care trebuie executate una după alta. Variabilele pot fi folosite pentru a stoca șiruri de caractere, valori ale indexului întreg, rezultatele unei comenzi etc. Buclele sunt necesare atunci când utilizatorul dorește să execute o anumită comandă de mai multe ori. Este de folos în special atunci când ieșirea unei comenzi este sub forma unei liste, iar pe fiecare rezultat, din listă, urmează să fie rulată o a doua comandă.

Sintaxă generală

Sintaxa generală pentru pentru bucla în Bash este:

pentru in do ...... gata

Aici este o variabilă Bash, care trebuie să fie un nume valid de variabilă Linux, adică numele conține o combinație de litere (az, AZ), numere (0-9) și liniuță de subliniere ( _ ) și trebuie să înceapă fie cu o literă, fie o subliniere.

The este fie o gamă personalizată de indici întregi care vor fi redate în buclă, fie o listă personalizată de numere întregi sau șiruri. Poate conține, de asemenea, o altă comandă Linux, totuși, rezultatul unei astfel de comenzi trebuie să fie separate prin spații sau caractere newline, adică analizabil de Bash într-o listă (O listă în Bash este practic o colecție de valori separate printr-un spațiu sau o nouă linie). ).

Indiferent de comenzile care urmează să fie executată, trebuie plasată în interiorul face..terminat bloc.

Să vedem câteva exemple simple.

Buclă pe un interval de valori întregi: Următorul cod creează directoare numite dir1, dir2, dir3 până la dir10.

pentru i în {1..10} do mkdir dir$i făcut

Buclă pe o listă de valori fixe: Următorul cod tipărește fiecare șir sau întreg din lista fixă ​​dată.

pentru eu în Hello 1 2 3 Pa! do echo $i gata

Buclă la ieșirea unei comenzi: Următorul cod trece peste ieșirea lui ls și imprimă numele fiecărui fișier în formatul dat.

pentru i în `ls` do echo "Numele fișierului este $i" gata

Sintaxă bazată pe expresii

O sintaxă bazată pe expresii similară cu limbajul de programare C este de asemenea posibilă în Bash:

pentru ((Expresia 1; Expresia 2; Expresia 3)) do ... ... gata

Aici, Expresia 1 este inițializarea variabilelor de index. Expresia 2 este condiția în care trebuie ieșită din buclă; această condiție este verificată la fiecare iterație. Expresia 3 specifică creșterea/scăderea/modificarea valorii variabilelor de index

Următorul exemplu imprimă pur și simplu valori de la 0 la 4:

pentru ((i=0;i<5;i++)) do echo $i facut

Următorul exemplu creează o buclă infinită, deoarece nu sunt specificate expresii:

pentru (( ; ; )) face eco „Apăsați Ctrl-C pentru a opri” gata

Rupeți și continuați

Declarație Break pentru ieșire condiționată

Putem folosi și declarația condiționată dacă în interiorul buclei. The dacă declarația poate fi folosită cu a pauză instrucțiune, pentru o ieșire condiționată din buclă.

pentru ((i=0;i<10;i++)) do if [[ $i -eq 5 ]] atunci break else echo $i; fi gata

Bucla de mai sus va imprima numere de la 0 la 4. Apoi, când valoarea lui i este 5, se va ieși din buclă. Acest lucru este deosebit de util atunci când o buclă urmează să fie ieșită atunci când o comandă oferă o ieșire specifică. De exemplu, următoarea buclă se întrerupe dacă și când găsește un fișier gol.

pentru fișierul în `ls` do flen=`wc -c $fișier` dacă [[ "$flen" = "0 $fișier" ]] atunci echo "$fișierul este gol" break else echo $flen fi terminat 

Comanda wc -c imprimă numărul de linii din fișier . Îl tipărește în format , de exemplu, 10 test.txt. Ieșim din buclă când numărul de linii este 0, adică un fișier gol.

Continuați declarația pentru a omite o iterație în mod condiționat

Similar cu C și cu multe alte limbaje de programare, bash are și a continua declarație, pentru a sări peste partea rămasă a unei iterații într-o buclă dacă o anumită condiție este îndeplinită.

pentru ((i=0;i<10;i++)) do if [[ $i -eq 5 ]] apoi continua fi echo $i; Terminat

Bucla de mai sus va tipări numere de la 0 la 10, cu excepția lui 5, deoarece în timpul iterației de i=5 există o instrucțiune continue, care va sări peste restul codului în buclă la începutul iterației i=6.

În exemplul următor, imprimăm numărul de linii dintr-un fișier și o anumită iterație va fi continua dacă este un director și nu un fișier.

pentru fișierul în `ls` do if [[ -d $file ]] apoi continua fi wc -c "$file" gata

[[ -d $fișier ]] verifică dacă fișierul este un director. Dacă este, atunci trecem la următorul fișier, adică la următoarea iterație. Dacă nu este un director, imprimăm numărul de linii din fișier folosind WC comandă, așa cum s-a arătat și anterior.

Utilizarea buclelor: scripturi și linie de comandă

Sintaxa buclei poate fi utilizată în shell Bash direct sau dintr-un fișier script shell. Odata pentru Sintaxa buclei este introdusă pe shell, shell-ul continuă promptul pentru a permite utilizatorului să continue comenzile care urmează să fie redate în buclă.

Sau utilizatorul poate salva acest lucru într-un fișier script și poate executa fișierul script.

The #!/bin/bash la început specifică interpretul care urmează să fie utilizat atunci când fișierul este executat. Deși Bash este cel mai frecvent utilizat shell în zilele noastre, unii utilizatori preferă shell-uri precum zsh, care ar trebui specificat în loc de bash la începutul acestui fișier.

Pentru a acorda permisiuni de execuție pentru acest fișier, rulați:

chmod +x test.sh

In cele din urma, pentru a executa fisierul, alerga:

./test.sh

Concluzie

The pentru bucla în Bash este o caracteristică destul de simplă, dar este utilizată în aproape toate tipurile de scenarii complexe de scripting. Învățarea acesteia înseamnă mult, indiferent dacă sunteți un utilizator Linux obișnuit sau avansat, sau că începeți să învățați automatizarea pentru administrarea sistemului și sarcinile DevOps.