Tot ce trebuie să știți despre Bash pentru bucle în Linux

Tot ce trebuie să știți despre Bash pentru bucle în Linux

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, tocmai 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 .





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
echo 'Hello, World'

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

The 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, Lumea apare tipărită 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:

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

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:

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

Unele limbi folosesc o sintaxă ușor diferită care schimbă ordinea colecției și a articolului:

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

Pentru în bucle

În bash, foreach - sau pentru în —Bucla este mai frecventă. Sintaxa de bază este, pur și simplu:

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

De exemplu, pentru a itera prin trei fișiere denumite explicit:

cum să văd toate conturile asociate e-mailului meu
for file in one.c two.c three.c
do
ls '$file'
done

Dacă astfel de fișiere există în directorul curent, ieșirea din acest script va fi:

one.c
two.c
three.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”:

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

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 toaleta (număr de cuvinte) pentru a face diferența mai evidentă:

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

The toaleta programul numără separat numărul de linii din fiecare fișier, apoi imprimă un număr total pe toate. În schimb, dacă toaleta operează într-o buclă for:

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

Veți vedea în continuare numărul pentru fiecare fișier:

44 feed.xml
231 sitemap.xml

Dar nu există un rezumat total, deoarece toaleta 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:

for file in one.c two.c

Nu asa:

for file in 'one.c two.c'

Al doilea exemplu cuprinde nume de fișiere între ghilimele duble, ceea ce duce la 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:

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

Rețineți că declarația variabilă în sine trebuie să-și includă valoarea în ghilimele duble!

ce să faci dacă telefonul tău este spart

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
for a
do
echo $a
done

Apoi, executarea args.sh vă va oferi următoarele:

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

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ă:

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

Aceasta este forma clasică cu trei părți în care:

  1. o variabilă este inițializată (i = 1) când se întâlnește prima buclă
  2. bucla continuă atât timp cât condiția (i<=5) is true
  3. 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ă:

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

Extinderea bretelei care are loc în mod eficient traduce cele de mai sus pentru buclă în:

for i in 1 2 3 4

Control mai bun al buclelor 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 care are mai mult de 100 de caractere:

#!/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

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.

Acțiune Acțiune Tweet E-mail Merită să faceți upgrade la Windows 11?

Windows a fost reproiectat. Dar este suficient pentru a vă convinge să treceți de la Windows 10 la Windows 11?

Citiți în continuare
Subiecte asemănătoare
  • Programare
  • Linux
Despre autor Bobby Jack(58 articole publicate)

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.

Mai multe de la Bobby Jack

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona