Mester Bash-matriser: En komplett guide

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.