Un ghid pentru matricele Bash
Publicat: 2022-12-30În acest ghid despre tablourile Bash, veți învăța cum să declarați și să lucrați cu tablouri indexate și asociative în Bash.
În Bash, puteți crea matrice pentru a stoca o colecție de elemente. Matricele Bash sunt colecții unidimensionale . În limbajele de programare precum C și C++, tablourile sunt colecții de elemente de același tip de date. Cu toate acestea, în Bash, în funcție de cazul de utilizare, puteți stoca numere întregi și șiruri de caractere în aceeași matrice.
În acest tutorial, veți învăța cum să declarați o matrice Bash și să accesați elementele acesteia. Veți învăța apoi cum să faceți o buclă printre elementele unei matrice și să adăugați elemente la o matrice. În cele din urmă, veți afla despre tablourile asociative în Bash.
Sa incepem!
Vă interesează să codificați? Iată premisele:
- Dacă sunteți pe un Mac sau pe o mașină Linux, puteți deschide terminalul și codifica.
- Dacă sunteți pe o mașină Windows, vă rugăm să instalați Git Bash sau subsistemul Windows pentru Linux (WSL2).
Cum să declarați o matrice Bash
În această secțiune, veți învăța sintaxa pentru a declara o matrice Bash și exemple de cod.
Sintaxa Declarației Bash Array
Puteți declara o matrice în Bash folosind următoarea sintaxă:
$ arrayName=(elt1 elt2 ... eltN) # arrayName is the name of the array # elt1 through eltN are the N elements in the array
În sintaxa de mai sus, arrayName
denotă numele matricei care conține N
elemente elt1...eltN
.
Elementele unui tablou sunt cuprinse între parantezele de deschidere și de închidere ()
. De asemenea, observați că elementele matricei sunt separate printr-un spațiu alb . Ca și în cazul oricărei variabile Bash, nu ar trebui să existe spațiu înainte sau după operatorul de atribuire =
.
În majoritatea celorlalte limbaje de programare, veți separa elementele unui tablou sau colecții similare prin virgule. Dar în Bash, spațiul alb este separatorul.
În Bash, astfel de matrice în care elementele sunt identificate prin indexul lor sunt denumite matrice indexate .
Declararea matricelor indexate în Bash
Să creăm prices
, o serie de numere.
$ prices=(24 27 18 30 15)
După cum se menționează în sintaxă, numerele din tabloul de
prices
sunt separate printr-un spațiu alb, cuprins între paranteze, fără spații înainte și după operatorul de atribuire =.
În Bash, puteți folosi comanda echo
pentru a imprima valoarea unei variabile. Folosind $variableName
se tipărește valoarea variableName
. Cu toate acestea, puteți vedea că folosind numele matricei se tipărește doar primul element.
$ echo $prices 24
Matricele Bash urmează indexarea zero. Deci primul element este la indicele 0, al doilea element este la indicele 1 și așa mai departe. De asemenea, puteți utiliza indexarea negativă; indicele ultimului element de matrice este -1.
Ce se întâmplă dacă încercați să accesați elementul la un anumit index și să îl imprimați? Să încercăm să tipărim elementul de la indexul 1.
$ echo $prices[1] 24[1]
De ce este ieșirea 24[1]? Acest lucru se datorează faptului că Bash înlocuiește $prices
cu 24, primul element din matrice și [1] este tipărit ca atare.
Pentru a tipări elementul la un anumit index, puteți utiliza extinderea parametrilor sub forma ${prices[index]}
.
$ echo ${prices[1]} # 27 $ echo ${prices[2]} # 18
Pentru a tipări toate elementele din matrice, puteți specifica @
în loc de un index specific.
$ echo ${prices[@]} 24 27 18 30 15
În continuare, să creăm o matrice de șiruri. Rularea următoarei comenzi creează o matrice indexată:
$ declare -a fruits
Opțiunea -a
creează o matrice indexată. Acum puteți popula matricea, câte un element, declarând elementul la un index specific, așa cum se arată mai jos:
$ fruits[0]="cherry" $ fruits[1]="berry" $ fruits[2]="apple" $ fruits[3]="pear" $ fruits[4]="melon" $ fruits[5]="orange"
Acum, pentru a imprima toate elementele matricei, puteți folosi ${fruits[@]}
.
$ echo ${fruits[@]} cherry berry apple pear melon orange
Accesați elementele unui tablou Bash

Puteți accesa elementele matricei în următoarele moduri:
- Circulați prin matrice și accesați direct elementul
- Buclă prin setul de indici și accesați elemente la un index specific
Buclă prin matrice și elementele de acces
Dacă ați codificat în Python, veți fi folosit bucla for folosind următoarea sintaxă:
for elt in some_list: print(elt)
Acum să scriem echivalentul Bash al buclei for de mai sus.
Știm că {prices[@]}
se extinde la toate elementele din matricea de prices
. Și ${prices[@]}
ne oferă valorile tuturor elementelor.
Bash for bucla este similară cu sintaxa buclei for a lui Python, dar instrucțiunile din corpul buclei ar trebui să fie incluse în do
și done
, după cum se arată:
$ for price in ${prices[@]} > do > echo $price > done
Deoarece folosim comanda echo și imprimăm valoarea price
variabil, obținem următoarea ieșire:
# output 24 27 18 30 15
Accesați elementele utilizând indexul matricei
O altă modalitate de a trece prin matrice este utilizarea indexului elementelor. Aceasta este similară cu construcția buclei for din Python care utilizează funcția range()
:

for i in range(len(some_list)): print(i)
Pentru a obține o listă de indecși prin care să treceți în buclă, puteți plasa un semn de exclamare ( !
) înaintea numelui matricei în extinderea parametrilor. Aceasta vă va oferi lista tuturor indecșilor validi pentru matrice, după cum se arată:
$ echo ${!prices[@]} 0 1 2 3 4
Matricea de prices
conține 5 elemente, deci indicele începe de la 0 și merge până la 4.
Apoi, putem parcurge lista de indexuri și accesăm elementul de la fiecare index. Pentru indicele i
, ${prices[i]}
este elementul de la indicele i
.
$ for i in ${!prices[@]} > do > echo ${prices[i]} > done
Bucla de mai sus tipărește toate elementele din matrice.
# output 24 27 18 30 15
Aici, după accesarea fiecărui element, efectuăm o operațiune simplă de tipărire a valorii acestuia. În general, putem avea orice procesare validă asupra elementelor.
Adăugați elemente la o matrice Bash

În tabloul de prices
, avem cinci elemente (la indicii 0,1,2,3 și 4). Dacă doriți să adăugați un element la sfârșitul matricei la indexul 5, puteți face acest lucru după cum urmează:
$ prices[5]=21
Vedem că 21 a fost adăugat la sfârșitul matricei de prețuri.
$ echo ${prices[@]} 24 27 18 30 15 21
Cu toate acestea, este mai convenabil să atașați la sfârșitul matricei – fără a ne aminti – indexul ultimului element adăugat sau numărul de elemente aflate în prezent în matrice.
Puteți folosi arrayName+=(elements(s))
pentru a adăuga unul sau mai multe elemente la o matrice, după cum se arată:
$ prices+=(10)
Acum, dacă tipărim matricea de prices
, vedem că 10 a fost adăugat la sfârșitul matricei.
$ echo ${prices[@]} 24 27 18 30 15 21 10
În continuare, să învățăm cum să declarăm tablouri asociative în Bash.
Matrice asociative în Bash
Dacă doriți să definiți o relație în termeni de perechi cheie-valoare, puteți utiliza o matrice asociativă . Puteți declara o matrice asociativă folosind următoarea sintaxă generală. Observați că folosim opțiunea -A
în loc de -a
.
$ declare -A fruits_prices
Puteți adăuga elemente la tabloul asociativ specificând cheia și valoarea corespunzătoare. Aici, am adăugat numele fructelor ca chei și numerele din matricea de prețuri ca valori.
$ fruits_prices[cherry]=24 $ fruits_prices[berry]=27 $ fruits_prices[apple]=18 $ fruits_prices[pear]=30 $ fruits_prices[melon]=15 $ fruits_prices[orange]=21
Deci, cum accesăm elementele dintr-o matrice asociativă?
Așa cum ați căuta valoarea folosind cheia corespunzătoare într-un dicționar Python, puteți accesa valorile într-o matrice asociativă folosind cheile.
$ echo ${fruits_prices[berry]} # 27
Vedem că ${fruits_prices[@]}
se extinde la valori și ${!fruits_prices[@]}
se extinde la chei.
$ echo ${fruits_prices[@]} # Output: 18 27 21 24 30 15 $ echo ${!fruits_prices[@]} # Output: apple berry orange cherry pear melon
Notă : Ordinea elementelor nu este aceeași cu ordinea în care le-am adăugat. Acest lucru se datorează faptului că, spre deosebire de tablourile indexate, tablourile asociative nu sunt colecții ordonate. Mai degrabă, ele lucrează la asocierea dintre chei și valori. Prin urmare, cheile sunt pentru tablourile asociative ceea ce indicii sunt pentru tablourile indexate.
De asemenea, puteți parcurge matricea asociativă și puteți accesa cheile, așa cum se arată:
$ for key in ${!fruits_prices[@]} > do > echo $key > done
# Output apple berry orange cherry pear melon
Următoarea buclă arată cum puteți accesa valorile.
$ for value in ${fruits_prices[@]} > do > echo $value > done
# Output 18 27 21 24 30 15
Deși este recomandat să utilizați arrayName[key]=value
, îl puteți declara și ca o secvență ca aceasta:
declare -A arrayName arrayName=(key1 value1 key2 value2 ... keyN valueN)
În acest fel, Bash deduce primul element ca prima cheie, al doilea element ca prima valoare și așa mai departe.
Rezumând
Sper că acum înțelegeți cum să creați și să lucrați cu matrice Bash. Iată o scurtă trecere în revistă a ceea ce ați învățat.
- Puteți declara o matrice indexată în Bash folosind sintaxa
arrayName=(elt1 elt2 elt3 ... eltN)
sau rulațideclare -a arrayName
și adăugați elemente la matrice. - Pentru a accesa elementele, puteți trece prin buclă folosind
${arrayName[@]}
. Alternativ, puteți obține lista tuturor indecșilor validi folosind extensia de parametri${!arrayName[@]}
. - În cele din urmă, ați învățat și cum să declarați o matrice asociativă pentru a stoca perechi cheie-valoare în Bash.
Apoi, consultați tutorialul pentru bucle în Bash.