9 Exemple de bucle for în scripturile Linux Bash

Publicat: 2022-08-19
Linia de comandă Linux pe un laptop pe un fundal albastru.
fatmawati achmad zaenuri/Shutterstock.com

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.

9 exemple de script Bash pentru a începe să utilizați Linux
9 exemple de script Bash pentru a începe să utilizați Linux

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 

a pentru numărarea buclei de la 1 la 5

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 

a pentru numărarea buclei printr-o listă nesecvențială de numere

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 

o numărătoare pentru buclă printr-o listă nesortată de numere

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 

Realizarea unui script executabil cu chmod

Să rulăm scriptul.

 ./listă-cuvinte.sh 

O buclă for care lucrează printr-o listă de cuvinte

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 

O buclă for folosind un interval de numere

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 

O buclă for folosind un pas de iterator de 4

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 

O buclă for folosind o listă de nume de fișiere

Î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 

O buclă for folosind un model de fișier *.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 

O buclă for luând un model de fișier ca parametru de linie de comandă

De asemenea, putem trece în mai multe modele la un moment dat.

 ./filenames3.sh n*.sh .bashrc 

O buclă for care preia un model de fișier și parametrii liniei de comandă a unui nume de fișier

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 

O buclă pentru trei termeni sau C-like

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 

Un C-like pentru numărătoarea inversă a buclei

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 

O buclă infinită pentru C asemănătoare

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 

O buclă for folosind o matrice de cuvinte

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 

O buclă for care omite o intrare într-o matrice de cuvinte din cauza comenzii continue

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 

O buclă for abandonează procesarea ulterioară din cauza comenzii break

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.

Ce sunt dicționarele Bash pe Linux și cum le folosiți?
RELATE Ce sunt dicționarele Bash pe Linux și cum le folosiți?

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 

Folosind o buclă for pentru a extrage elemente dintr-o matrice asociativă

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 

Folosind o buclă for pentru a repeta peste ieșirea a două comenzi piperate

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.

Cum să procesați un fișier linie cu linie într-un script Linux Bash
LEGATE Cum să procesați un fișier linie cu linie într-un script Linux Bash

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.