Un ghid pentru matricele Bash

Î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ă codați împreună? Iată premisele:

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 prețuri, o serie de numere.

$ prices=(24 27 18 30 15)

După cum se menționează în sintaxă, numerele din tabloul de prețuri sunt separate printr-un spațiu alb, cuprins între paranteze, fără spații înainte și după operatorul de atribuire =.

  Ce este un fișier WebP (și cum deschid unul)?

În Bash, puteți folosi comanda echo pentru a imprima valoarea unei variabile. Folosind $variableName se tipărește valoarea variabilei. 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 imprima elementul la un anumit index, puteți utiliza extinderea parametrilor din 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 tipări 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ă {prețuri[@]} se extinde la toate elementele din tabloul de prețuri. Și ${prețuri[@]} ne oferă valorile tuturor elementelor.

  Cum să vă amintiți unde ați parcat folosind Asistentul Google

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 prețului 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 prețuri 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, ${prețuri[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 prețuri, 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(e)) pentru a adăuga unul sau mai multe elemente la o matrice, după cum se arată:

$ prices+=(10)

Acum, dacă tipărim matricea de prețuri, 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.

  Cele mai bune 10 instrumente AI de îmbunătățire a videoclipurilor pentru a obține videoclipuri de calitate profesională

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 valorile și ${!fruits_prices[@]} se extinde la taste.

$ 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 indecșii sunt pentru tablourile de indexare.

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]=valoare, o 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ți declare -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.