Introduksjon til Bash Arrays
Denne veiledningen vil utforske hvordan du deklarerer og manipulerer både indekserte og assosiative matriser i Bash-skripting. Vi går gjennom grunnleggende syntaks, metoder for tilgang til elementer, og hvordan legge til nye elementer i matriser.
I Bash kan du benytte matriser for å organisere en samling av data. En Bash-matrise er i utgangspunktet en endimensjonal datastruktur. I motsetning til programmeringsspråk som C og C++, som krever at alle elementene i en matrise er av samme type, lar Bash deg kombinere både tall og tekststrenger i samme matrise, noe som øker fleksibiliteten.
Vi skal se på hvordan du oppretter en Bash-matrise, hvordan du får tak i spesifikke elementer, hvordan du går gjennom alle elementene, og hvordan du utvider matrisen. Vi vil også dekke de assosiative matrisene, som er en nyttig mekanisme for å lagre data i form av nøkkel-verdi par.
La oss komme i gang!
⚙ Er du klar for litt koding? Her er hva du trenger:
Hvordan Deklarere en Bash-matrise
I denne seksjonen vil vi utforske den grunnleggende syntaksen for å deklarere en matrise i Bash, supplert med kodeeksempler for å illustrere praksisen.
Grunnleggende Syntaks for Matrise Deklarasjon
En matrise kan deklareres ved hjelp av denne syntaksen:
$ matrisenavn=(element1 element2 ... elementN)
# matrisenavn er navnet på matrisen
# element1 til elementN er elementene i matrisen
I denne syntaksen representerer «matrisenavn» navnet du gir matrisen, og «element1» til «elementN» representerer de N elementene som matrisen inneholder.
Elementene er omsluttet av vanlige parenteser `()`, og hvert element er atskilt med et mellomrom. Akkurat som ved vanlige Bash-variabler, er det viktig at det ikke er mellomrom verken før eller etter likhetstegnet `=`.
📝 I de fleste andre programmeringsspråk vil du vanligvis bruke komma `,` for å skille elementene i en matrise. Men i Bash er det mellomrom som fungerer som skilletegn.
I Bash kalles matriser hvor elementene blir identifisert med en indeks for en «indeksert matrise».
Eksempel på Indekserte Matriser
La oss lage en matrise som inneholder priser:
$ priser=(24 27 18 30 15)
Som nevnt tidligere, er tallene skilt med et mellomrom, omsluttet av parenteser, og uten mellomrom før eller etter likhetstegnet.
I Bash bruker vi `echo`-kommandoen for å printe ut verdien av en variabel. For å printe ut verdien av en variabel, bruker vi `$` etterfulgt av variabelnavnet. Hvis vi bruker denne metoden på en matrise, vil kun det første elementet skrives ut.
$ echo $priser
24
Bash-matriser er null-indekserte, noe som betyr at det første elementet er på indeks 0, det andre på indeks 1, og så videre. Negativ indeksering er også mulig; det siste elementet har indeks -1.
Hva skjer om du prøver å skrive ut elementet på en spesifikk indeks, ved å bruke `echo $priser[1]`?
$ echo $priser[1]
24[1]
Utgangen blir `24[1]`. Dette skjer fordi Bash tolker `$priser` som det første elementet i matrisen, som er 24, og deretter bare printer `[1]` som en del av strengen.
For å printe ut elementet på en spesifikk indeks, må du bruke parameterutvidelse på formen `${priser[indeks]}`:
$ echo ${priser[1]}
# 27
$ echo ${priser[2]}
# 18
For å printe ut alle elementene i matrisen, bruk `@` i stedet for en spesifikk indeks.
$ echo ${priser[@]}
24 27 18 30 15
La oss nå opprette en matrise med tekststrenger. Følgende kommando lager en indeksert matrise:
$ declare -a frukt
Alternativet `-a` forteller Bash at dette skal være en indeksert matrise. Nå kan du fylle matrisen med elementer, ett element av gangen, ved å tilordne verdier til spesifikke indekser:
$ frukt[0]="kirsebær"
$ frukt[1]="bær"
$ frukt[2]="eple"
$ frukt[3]="pære"
$ frukt[4]="melon"
$ frukt[5]="appelsin"
For å vise alle elementene i matrisen, bruk `${frukt[@]}`:
$ echo ${frukt[@]}
kirsebær bær eple pære melon appelsin
Tilgang til Elementer i en Bash-matrise
Det finnes i hovedsak to måter å få tilgang til elementer i en matrise:
- Gå gjennom matrisen direkte og få tak i elementene
- Gå gjennom indekser og få tak i elementene ved hjelp av disse
Gå Gjennom Matrisen Direkte
I Python kan man bruke en for-løkke på følgende måte:
for element in liste:
print(element)
La oss skrive den tilsvarende koden i Bash.
Vi vet at `${priser[@]}` gir oss alle elementene i pris-matrisen. For å gjøre det mulig å behandle hvert element i en `for`-løkke, må vi omslutte kommandoene i løkken med `do` og `done`, som vist under:
$ for pris in ${priser[@]}
> do
> echo $pris
> done
Dette vil gi følgende utskrift:
# Output
24
27
18
30
15
Gå Gjennom Indekser
En annen måte å behandle alle elementene i en matrise, er å bruke indeksene. Dette tilsvarer å bruke `range()` funksjonen i Python:
for i in range(len(liste)):
print(i)
For å hente ut en liste over indekser, kan du plassere et utropstegn `!` foran matrisenavnet i parameterutvidelsen. Dette gir en liste med alle gyldige indekser:
$ echo ${!priser[@]}
0 1 2 3 4
Siden `priser`-matrisen har 5 elementer, går indeksene fra 0 til 4.
Nå kan vi iterere gjennom denne listen med indekser og få tak i elementene for hver enkelt indeks. For en gitt indeks `i`, vil `${priser[i]}` gi elementet med den indeksen.
$ for i in ${!priser[@]}
> do
> echo ${priser[i]}
> done
Dette vil gi samme output som tidligere:
# Output
24
27
18
30
15
💬 Her utfører vi en enkel print-operasjon etter at vi har hentet hvert element. Generelt kan vi gjøre hva som helst med elementene som behandles.
Legge til Elementer i en Bash-Matrise
Pris-matrisen har for øyeblikket fem elementer (ved indeksene 0, 1, 2, 3 og 4). Hvis du ønsker å legge til et element på slutten av matrisen, for eksempel ved indeks 5, kan du gjøre det slik:
$ priser[5]=21
Dette vil legge til `21` på slutten av matrisen:
$ echo ${priser[@]}
24 27 18 30 15 21
Det er imidlertid mer praktisk å legge til elementer på slutten av matrisen uten å måtte huske den siste indeksen eller antall elementer i matrisen.
Du kan bruke `matrisenavn+=(element(er))` for å legge til ett eller flere elementer, som vist her:
$ priser+=(10)
Dette vil legge til 10 på slutten av matrisen:
$ echo ${priser[@]}
24 27 18 30 15 21 10
La oss se på hvordan man deklarerer assosiative matriser i Bash.
Assosiative Matriser i Bash
Assosiative matriser lar deg definere relasjoner i form av nøkkel-verdi-par. Deklarer en assosiativ matrise ved å bruke følgende syntaks, der vi bruker `-A` i stedet for `-a`:
$ declare -A frukt_priser
Elementer kan legges til i den assosiative matrisen ved å spesifisere nøkkelen og den korresponderende verdien. Her legger vi til fruktnavn som nøkler, og prisene fra den tidligere matrisen som verdier:
$ frukt_priser[kirsebær]=24
$ frukt_priser[bær]=27
$ frukt_priser[eple]=18
$ frukt_priser[pære]=30
$ frukt_priser[melon]=15
$ frukt_priser[appelsin]=21
Hvordan henter vi ut elementer fra en assosiativ matrise?
Akkurat som man henter verdier fra en Python-ordbok ved hjelp av nøkkelen, kan du få tilgang til verdiene i en assosiativ matrise med nøklene:
$ echo ${frukt_priser[bær]}
# 27
`${frukt_priser[@]}` gir verdiene og `${!frukt_priser[@]}` gir nøklene:
$ echo ${frukt_priser[@]}
# Output: 18 27 21 24 30 15
$ echo ${!frukt_priser[@]}
# Output: eple bær appelsin kirsebær pære melon
Merk: Rekkefølgen på elementene er ikke nødvendigvis den samme som rekkefølgen du la dem til i. Assosiative matriser er ikke ordnede samlinger, de jobber med assosiasjonen mellom nøklene og verdiene. Nøklene til assosiative matriser fungerer på samme måte som indekser i indekserte matriser.
Du kan også gå gjennom en assosiativ matrise og få tak i nøklene, som vist under:
$ for key in ${!frukt_priser[@]}
> do
> echo $key
> done
# Output
eple
bær
appelsin
kirsebær
pære
melon
Følgende løkke viser hvordan man får tak i verdiene:
$ for value in ${frukt_priser[@]}
> do
> echo $value
> done
# Output
18
27
21
24
30
15
Selv om det anbefales å bruke `matrisenavn[nøkkel]=verdi`, kan du også deklarere den som en sekvens slik:
declare -A matrisenavn
matrisenavn=(nøkkel1 verdi1 nøkkel2 verdi2 ... nøkkelN verdiN)
På denne måten vil Bash tolke det første elementet som første nøkkel, det andre elementet som første verdi, og så videre.
Oppsummering
Jeg håper du har fått en god forståelse for hvordan man oppretter og jobber med Bash-matriser. Her er en rask oppsummering av det vi har lært:
- En indeksert matrise i Bash deklareres med syntaksen `matrisenavn=(element1 element2 element3 … elementN)`, eller ved å kjøre `declare -a matrisenavn` og deretter legge til elementer.
- For å hente elementer, kan du iterere gjennom dem med `${matrisenavn[@]}`, eller få tak i en liste over gyldige indekser med parameterutvidelsen `${!matrisenavn[@]}`.
- Vi har også sett hvordan man kan deklarere en assosiativ matrise for å lagre nøkkel-verdi-par i Bash.
Neste steg kan være å utforske veiledningen for løkker i Bash.