Водич за Басх низове

U ovom vodiču o Bash nizovima, istražićemo načine deklarisanja i manipulisanja indeksiranim i asocijativnim nizovima u Bash skriptama.

U Bash-u, nizovi služe za čuvanje kolekcija elemenata. Bash nizovi su jednodimenzionalni. Za razliku od jezika poput C i C++ gde su nizovi kolekcije elemenata istog tipa, u Bash-u možete, u zavisnosti od potrebe, skladištiti i cele brojeve i stringove u istom nizu.

U ovom uputstvu, detaljno ćemo obraditi kako se deklariše Bash niz i pristupa njegovim elementima. Zatim, naučićete kako iterirati kroz elemente niza i dodavati nove elemente. Na kraju, razmotrićemo i asocijativne nizove u Bash-u.

Započnimo!

⚙ Želite li da kodirate zajedno? Evo kratkog pregleda preduslova:

Kako deklarisati Bash niz

U ovom delu, upoznaćemo se sa sintaksom za deklaraciju Bash nizova, uz praktične primere koda.

Sintaksa deklaracije Bash niza

Niz u Bash-u se može deklarisati na sledeći način:

$ imeNiza=(element1 element2 ... elementN)

# imeNiza je naziv niza
# element1 do elementN predstavljaju N elemenata niza

U gore prikazanoj sintaksi, imeNiza je naziv niza koji sadrži N elemenata: element1, element2, sve do elementN.

Elementi niza su grupisani unutar zagrada (). Važno je napomenuti da su elementi niza odvojeni razmakom. Kao i kod svih Bash promenljivih, ne sme biti razmaka pre ili posle operatora dodele =.

📑 U mnogim programskim jezicima, elementi niza ili sličnih kolekcija se odvajaju zarezima. Međutim, u Bash-u, razmak ima ulogu separatora.

U Bash-u, nizovi u kojima su elementi identifikovani svojim indeksom nazivaju se indeksirani nizovi.

Deklarisanje indeksiranih nizova u Bash-u

Kreirajmo, na primer, niz cena, koji će sadržati numeričke vrednosti.

$ cene=(24 27 18 30 15)

Kao što smo objasnili u sintaksi, brojevi u nizu cene su razdvojeni razmakom, uokvireni su zagradama, i nema razmaka ni pre ni posle operatora dodele =.

U Bash-u se za ispis vrednosti promenljive koristi komanda echo. Upotrebom $imePromenljive ispisuje se vrednost promenljive imena imePromenljive. Međutim, korišćenjem imena niza bez indeksa će ispisati samo prvi element niza.

$ echo $cene
24

Bash nizovi koriste indeksiranje od nule, što znači da je prvi element na indeksu 0, drugi na indeksu 1, i tako dalje. Takođe je moguće koristiti negativno indeksiranje; indeks poslednjeg elementa niza je -1.

Šta se dešava kada pokušamo da pristupimo elementu na određenom indeksu i ispišemo ga? Hajde da pokušamo da ispišemo element sa indeksom 1.

$ echo $cene[1]
24[1]

Zašto je ispis 24[1]? 🤔 Zato što Bash zamenjuje $cene sa 24, prvim elementom u nizu, a [1] se ispisuje doslovno.

Da biste ispisali element na određenom indeksu, koristite proširenje parametara u obliku ${cene[indeks]}.

$ echo ${cene[1]}
# 27
$ echo ${cene[2]}
# 18

Da biste ispisali sve elemente u nizu, koristite @ umesto konkretnog indeksa.

$ echo ${cene[@]}
24 27 18 30 15

Sada, kreirajmo niz stringova. Sledeća komanda kreira indeksirani niz:

$ declare -a voce

Opcija -a kreira indeksirani niz. Sada možete popuniti niz, element po element, tako što ćete elementu dodeliti određeni indeks, kao što je prikazano ispod:

$ voce[0]="tresnja"
$ voce[1]="jagoda"
$ voce[2]="jabuka"
$ voce[3]="kruska"
$ voce[4]="dinja"
$ voce[5]="pomorandza"

Da biste ispisali sve elemente niza, možete koristiti ${voce[@]}.

$ echo ${voce[@]}
tresnja jagoda jabuka kruska dinja pomorandza

Pristup elementima Bash niza

Elementima niza možete pristupiti na dva glavna načina:

  • Prolaskom kroz niz i direktnim pristupom elementima
  • Prolaskom kroz niz indeksa i pristupom elementima na određenim indeksima

Prolazak kroz niz i pristup elementima

Ako ste programirali u Python-u, koristili biste for petlju sa sintaksom:

for element in neka_lista:
    print(element)

Hajde da sada napišemo Bash ekvivalent za gornju for petlju.

Znamo da se {cene[@]} proširuje na sve elemente u nizu cena. A ${cene[@]} nam daje vrednosti svih elemenata.

Bash for petlja je slična Python for petlji, ali naredbe unutar tela petlje treba da budu uokvirene sa do i done, kao što je prikazano:

$ for cena in ${cene[@]}
> do
> echo $cena
> done

Pošto koristimo komandu echo i ispisujemo vrednost promenljive cena, dobijamo sledeći izlaz:

# izlaz
24
27
18
30
15

Pristup elementima pomoću indeksa niza

Drugi način za prolazak kroz niz je korišćenje indeksa elemenata. Ovo je slično konstrukciji for petlje u Python-u koja koristi funkciju range():

for i in range(len(neka_lista)):
    print(i)

Da biste dobili listu indeksa za petlju, možete koristiti uzvičnik (!) ispred imena niza u proširenju parametra. Ovo će vam dati listu svih važećih indeksa za niz, kao što je prikazano:

$ echo ${!cene[@]}
0 1 2 3 4

Niz cena sadrži 5 elemenata, tako da indeks počinje od 0 i ide do 4.

Sada možemo da prođemo kroz listu indeksa i pristupimo elementu na svakom indeksu. Za indeks i, ${cene[i]} je element na indeksu i.

$ for i in ${!cene[@]}
> do
> echo ${cene[i]}
> done

Gornja petlja ispisuje sve elemente u nizu.

# izlaz
24
27
18
30
15

💬 Ovde, nakon pristupanja svakom elementu, vršimo jednostavnu operaciju ispisivanja njegove vrednosti. U opštem slučaju, možemo imati bilo koju validnu obradu elemenata.

Dodavanje elemenata u Bash niz

U nizu cena imamo pet elemenata (na indeksima 0, 1, 2, 3 i 4). Ukoliko želite da dodate element na kraj niza, na indeksu 5, to možete uraditi na sledeći način:

$ cene[5]=21

Vidimo da je 21 dodat na kraj niza cena.

$ echo ${cene[@]}
24 27 18 30 15 21

Međutim, često je praktičnije dodati element na kraj niza bez pamćenja indeksa poslednjeg elementa ili ukupnog broja elemenata u nizu.

Možete koristiti imeNiza+=(element(i)) da dodate jedan ili više elemenata u niz, kao što je prikazano:

$ cene+=(10)

Sada, ako ispišemo niz cena, vidimo da je 10 dodato na kraj niza.

$ echo ${cene[@]}
24 27 18 30 15 21 10

Sada ćemo naučiti kako da deklarišemo asocijativne nizove u Bash-u.

Asocijativni nizovi u Bash-u

Ukoliko želite da definišete odnos u terminima parova ključ/vrednost, možete koristiti asocijativni niz. Asocijativni niz se deklariše pomoću sledeće opšte sintakse. Obratite pažnju da umesto opcije -a, koristimo opciju -A.

$ declare -A cene_voce

Možete dodati elemente asocijativnom nizu tako što ćete navesti ključ i odgovarajuću vrednost. Ovde dodajemo imena voća kao ključeve, a brojeve iz niza cena kao vrednosti.

$ cene_voce[tresnja]=24
$ cene_voce[jagoda]=27
$ cene_voce[jabuka]=18
$ cene_voce[kruska]=30
$ cene_voce[dinja]=15
$ cene_voce[pomorandza]=21

Kako sada pristupiti elementima u asocijativnom nizu?

Na isti način kao što biste u Python rečniku tražili vrednost pomoću odgovarajućeg ključa, možete pristupiti vrednostima u asocijativnom nizu pomoću ključeva.

$ echo ${cene_voce[jagoda]}
# 27

Vidimo da se ${cene_voce[@]} proširuje na vrednosti, a ${!cene_voce[@]} se proširuje na ključeve.

$ echo ${cene_voce[@]}
# Izlaz: 18 27 21 24 30 15
$ echo ${!cene_voce[@]}
# Izlaz: jabuka jagoda pomorandza tresnja kruska dinja

Napomena: Redosled elemenata nije isti kao redosled kojim smo ih dodali. To je zato što, za razliku od indeksiranih nizova, asocijativni nizovi nisu uređene kolekcije. Umesto toga, oni funkcionišu na osnovu asocijacije između ključeva i vrednosti. Stoga su ključevi za asocijativne nizove ono što su indeksi za indeksirane nizove.

Takođe, možete proći kroz asocijativni niz i pristupiti ključevima, kao što je prikazano:

$ for kljuc in ${!cene_voce[@]}
> do
> echo $kljuc
> done
# Izlaz
jabuka
jagoda
pomorandza
tresnja
kruska
dinja

Sledeća petlja prikazuje kako možete pristupiti vrednostima.

$ for vrednost in ${cene_voce[@]}
> do
> echo $vrednost
> done
# Izlaz
18
27
21
24
30
15

Iako je preporučena praksa korišćenje imeNiza[kljuc]=vrednost, možete ga deklarisati i kao niz na sledeći način:

declare -A imeNiza
imeNiza=(kljuc1 vrednost1 kljuc2 vrednost2 ... kljucN vrednostN)

Na ovaj način, Bash zaključuje da je prvi element prvi ključ, drugi element prva vrednost, i tako dalje.

Rezime

Nadam se da sada imate jasno razumevanje kako da kreirate i radite sa Bash nizovima. Evo kratkog pregleda onoga što ste naučili.

  • Možete deklarisati indeksirani niz u Bash-u pomoću sintakse imeNiza=(element1 element2 element3 … elementN) ili pokretanjem declare -a imeNiza i dodavanjem elemenata u niz.
  • Za pristup elementima, možete proći kroz niz koristeći ${imeNiza[@]}. Alternativno, možete dobiti listu svih važećih indeksa koristeći proširenje parametara ${!imeNiza[@]}.
  • Konačno, naučili ste kako da deklarišete asocijativni niz za čuvanje parova ključ-vrednost u Bash-u.

Sledeće pogledajte vodič o petljama u Bash-u.