Bash matriser grundig

Bash matriser grundig
I bash kan en matrise være en indeksert matrise eller en assosiativ matrise. En indeksert matrise er en liste hvis elementer er nummerert fra null. En assosiativ matrise er en liste der strenger har erstattet tallene. Anta en penn, en treningsbok, en lærebok, en linjal, $ 42, og en blyant på et studiebord. Disse 6 elementene kan skrives som en liste, som følger:
  1. penn
  2. Treningsbok
  3. lærebok
  4. Hersker
  5. 42
  6. blyant

Dette er et eksempel på en indeksert matrise. Det er 6 varer, men varene er nummerert fra null til 5. Nummerering på denne måten er indeksering. Indekstelling i bash begynner fra null og ikke 1.

Hvert av disse produktene er produsert av noe hovedmateriale. En liste over hovedmaterialet, etterfulgt av det ferdige produktet, er:

blekk => penn
mykt papir => Treningsbok
hardt papir => lærebok
plast => linjal
Spesiell papir => 42
tre => blyant

Dette er et eksempel på et assosiativt utvalg. Det er ikke nok å bare skrive disse matriser i en bash -fil. En av de forskjellige typene matriser må kodes. Kodingen av en indeksert matrise ligner på kodingen av et assosiativt utvalg. Imidlertid er det små, men viktige forskjeller. Denne artikkelen gir et dyptgående blikk på basrah-matriser.

Artikkelinnhold

  • Indeksert matrise
  • Assosiativ matrise
  • Konklusjon

Indeksert matrise

Opprette en indeksert matrise

En måte å lage den ovennevnte matrisen er som følger:

arr = (penn 'treningsbok' "lærebok" linjal 42 blyant)

Her er ARR navnet på matrisen. Programmereren kunne ha gitt noe annet navn. Mellomrom skiller de forskjellige elementene i matriselisten. Hvis et element består av mer enn ett ord, skrives det i enkelt- eller dobbelt-sitater. Indeksen for pennen er 0; "treningsbok" -indeksen er 1; Indeksen for "lærebok" er 2; Indeksen for linjal er 3; Indeksen for 42 er 4; Indeksen for blyant er 5.

En annen måte å lage ovennevnte matrise begynner som følger:

arr [2] = "lærebok"

Det vil si at matrisen opprettes, som begynner med et hvilket som helst element på listen. '2' i de firkantede parentesene er kjent som et abonnement. De andre elementene kan inkluderes senere, som følger:

arr [0] = penn
arr [1] = 'treningsbok'
arr [3] = linjal
arr [4] = 42
arr [5] = blyant

Legg merke til at i inkluderingen er ikke varen til indeks 2 gjentatt.

En annen måte å lage ovennevnte matrise er som følger:

erklære -a arr

Her er "erklærer" et reservert ord. '-a' betyr indeksert matrise. “ARR” er navnet på programmererens valg. Alle elementene kan deretter inkluderes som følger:

arr [0] = penn
arr [1] = 'treningsbok'
arr [2] = "lærebok"
arr [3] = linjal
arr [4] = 42
arr [5] = blyant

Dette er inkludering etter tildeling. Husk at når noen verdi er tilordnet en variabel, skal det ikke være noen plass mellom tildelingsoperatøren, = og variabelen eller verdien.

Refererer til indeksert element

Syntaksen for å referere til et element er:

$ name [abonnement]

Hvor navnet er navnet på matrisen, for eksempel ARR. Abonnement er et heltall (nummer).

Positive indekser

Indekstelling begynner normalt fra null. I følgende kode blir verdiene til elementene lest og vist:

arr = (penn 'treningsbok' "lærebok" linjal 42 blyant)
for ((i = 0; i < 6; ++i)); do
ekko $ arr [i]
Ferdig

Utgangen er:

penn
Treningsbok
lærebok
Hersker
42
blyant

Seks elementer begynner fra indeks null til indeks 5. Så iterasjonen gjøres 6 ganger og ikke 5 ganger.

Negative indekser

Negative indekser kan brukes til å få tilgang til elementer. I dette tilfellet refererer -1 til det siste elementet; -2 refererer til det siste-men-en-elementet; -3 refererer til elementet før siste-men-ett-elementet, og så videre. Så for ovennevnte matrise refererer -6 til det første elementet. Følgende kode illustrerer dette:

arr = (penn 'treningsbok' "lærebok" linjal 42 blyant)
for ((i = -1; i> = -6; --i)); gjøre
ekko $ arr [i]
Ferdig

Utgangen er:

blyant
42
Hersker
lærebok
Treningsbok
penn

Displayet er i omvendt rekkefølge.

Viser alle elementene i indeksert matrise

For å vise alle elementene, kan $ navn [*] eller $ navn [@] brukes. I disse uttrykkene er * eller @ i stedet for indeksen. Og med det, i stedet for å returnere verdiene til elementer, returneres verdiene til elementer i matrisen. Følgende kode illustrerer dette:

erklære -a arr
arr [1] = 'treningsbok' arr [3] = hersker arr [5] = blyant
ekko $ arr [@]
ekko $ arr [*]

Utgangen er,
Treningsboks hersker blyant
Treningsboks hersker blyant

Legg merke til at @ og * brukt på denne måten er synonymer. Det er et problem med utgangen: setningene er atskilt med mellomrom og kan ikke skilles ut. Følgende kode skal skille setningene med komma:

erklære -a arr
arr [1] = 'treningsbok' arr [3] = hersker arr [5] = blyant
Ifs =,
ekko "$ arr [@]"
ekko "$ arr [*]"

Utgangen er nå:

Treningsboks hersker blyant
treningsbok, hersker, blyant

IFS betyr internt feltskiller. Det har fått tildelt komma. Legg merke til bruken av doble sitater for $ arr [@] og $ arr [*] i Echo -kommandoene. Komma er inkludert for * abonnementet og ikke for @ -abonnementet. Det er fortsatt et annet problem: i den andre utgangslinjen, der komma har blitt ansatt, har det ikke blitt vist områder. Så, @ og * er ikke synonymer hele tiden. Imidlertid er det mulig å skille med komma og plass - se nedenfor.

Viser indekser for indeksert matrise

Uttrykket, $ !Navn [@] eller $ !Navn [*] Returnerer indeksene for en matrise som en liste, atskilt med mellomrom. Legg merke til bruken og plasseringen av utropstegn (!). Følgende kode viser bruken av disse uttrykkene:

arr [1] = 'treningsbok' arr [3] = hersker arr [5] = blyant
ekko $ !arr [@]
ekko $ !arr [*]

Utgangen er:
1 3 5
1 3 5

Lengde på indeksert matrise

Lengden på matrisen er gitt av:

$ #name [abonnement]

Hvor navnet er navnet som ARR, som programmereren ga til matrisen; abonnementet er den høyeste indeksen (lengde - 1) for elementet hvis verdi er angitt. Legg merke til bruken og plasseringen av symbolet, #. Følgende kode illustrerer dette:

arr = (penn 'treningsbok' "lærebok" linjal 42 blyant)
ekko $ #arr [5]

Utgangen er 6. Selv om noen eller alle de lavere elementene ikke er til stede, vil lengden fortsatt være høyest_index + 1. Følgende kode illustrerer dette:

erklære -a arr
arr [3] = linjal
arr [5] = blyant
ekko $ #arr [5]

Utgangen er fremdeles 6, selv om ikke noe element er der, for indeks 0, indeks 1, indeks 2 og indeks 4.

Antall elementer av indeksert matrise

Som det vist over, kan antall elementer i matrisen være mindre enn matrisens lengde. Dette er fordi verdiene til noen elementer under det siste elementet ikke er opprettet eller har vært usett. Uttrykket gir antall elementer som er satt i en indeksert matrise, $ #arr [@] eller $ #arr [*], som vist i følgende kode:

arr [1] = 'treningsbok' arr [3] = hersker arr [5] = blyant
ekko $ #arr [@]
ekko $ #arr [*]

Utgangen er:

3
3

Viser bare indekserte array -settelementer

Et indekselement tildelt en verdi er satt, mens det som ikke er tildelt en verdi er usett. Følgende kode viser bare verdiene som er angitt:

arr [1] = 'treningsbok' arr [3] = hersker arr [5] = blyant
for ((i = 0; i < $#arr[5]; ++i)); do
Hvis [ ! -z "$ arr [i]"]; deretter
printf "$ arr [i],"
fi
Ferdig
ekko

Utgangen er:

treningsbok, hersker, blyant,

Legg merke til hvordan de ikke -sene elementene er blitt identifisert og eliminert fra iterasjonen i tilstanden. Legg også merke til at i betingelsen er $ arr [i] i dobbelt-kvoter som "$ arr [i]", for at verdier som inneholder rom kan skrives ut. Printf -kommandoen ligner på Echo -kommandoen, men legger ikke til en ny linje etter å ha vist. Det har vært mulig å skille verdiene ved utgangen, med komma og rom, i en linje. Det siste ekkoet ville føre til at neste utgang går til neste linje.

En enklere form for ovennevnte kode er som følger:

arr [1] = 'treningsbok' arr [3] = hersker arr [5] = blyant
for jeg i $ !arr [@]; gjøre
printf "$ arr [i],"
Ferdig
ekko

Utgangen er den samme. Legg merke til uttrykket for listen etter det reserverte ordet, i. Dette uttrykket returnerer listen over indekser. Så det er ikke behov for IF-kondisjonen her.

Innstilling og usetting indekserte elementer og dets utvalg

Ethvert indeksert element som ikke er tildelt en verdi er usett. Et indeksert element som har en verdi tilordnet det er satt. Nå kan et element være med vilje usett, som følgende skript viser:

arr [1] = 'treningsbok' arr [3] = hersker arr [5] = blyant
Unset ARR [3]
for jeg i $ !arr [@]; gjøre
printf "$ arr [i],"
Ferdig
ekko

Utgangen er:

treningsbok, blyant,

“Linjal” er ikke vist. Syntaksen for å fjerne et element er:

Unset ArrayName [abonnement]

Syntaksen for å fjerne eller fjerne hele matrisen er:

Unset ArrayName

eller

Unset ArrayName [@]

eller

Unset ArrayName [*]

I følgende kode er hele matrisen ikke -settet:

arr = (penn 'treningsbok' "lærebok" linjal 42 blyant)
Unset arr
ekko "$ arr [*]"

Utgangen er ingenting (en tom linje) fordi hele matrisen har vært usett.

Assosiativ matrise

Som antydet ovenfor, er et eksempel på en assosiativ rekke skrevet på papir:

blekk => penn
mykt papir => Treningsbok
hardt papir => tekstbok
plast => linjal
Spesiell papir => 42
tre => blyant

Det er 6 elementer, som hver består av et nøkkel-/verdipar. For det første elementet er "blekk" nøkkelen og "penn" er verdien; For det andre elementet er "mykt papir" nøkkelen og "treningsbok" er verdien; og så videre.

Opprette et assosiativt utvalg

En måte å lage ovennevnte matrise er som følger:

erklære -a arr = ([blekk] = penn [mykt papir] = 'treningsbok' [hardt papir] = "tekstbok" [plast] = linjal [spesiell papir] = 42 [tre] = blyant)

Her er ARR navnet på matrisen. Programmereren kunne ha gitt noe annet navn. Mellomrom skiller de forskjellige elementene i matriselisten. Hvis en verdi består av mer enn ett ord, skrives den i enkelt- eller dobbeltkvoter. En nøkkel kan bestå av mer enn ett ord. Det er 6 nøkkel/verdipar i dette kodede assosiative matrisen. En nøkkel er plassert i firkantede parenteser. Verdien er tilordnet nøkkelen, med tildelingsoperatøren. '-A' betyr assosiativ matrise, og den skal være der.

En annen måte å lage ovennevnte matrise begynner som følger:

erklære -a arr

Her er "erklærer" et reservert ord. '-A' betyr assosiativ matrise (mens '-a' betyr indeksert matrise). “ARR” er navnet på programmererens valg. Elementer kan deretter inkluderes som følger:

erklære -a arr
arr [mykt papir] = 'treningsbok'
arr [plast] = linjal
arr [tre] = blyant

Alle elementene (6) skal ikke nødvendigvis inkluderes samtidig. Resten kan legges til senere. Dette legger til ved tildeling. Husk at når noen verdi er tilordnet en variabel, skal det ikke være noen plass mellom tildelingsoperatøren, = og variabelen eller verdien.

Refererer til assosiativt array -element

Syntaksen for å referere til et assosiativt array -element er:

$ name [abonnement]

Hvor navnet er navnet på matrisen, for eksempel ARR. Abonnement er nøkkelen i tekstskjema. I følgende kode blir verdiene til elementene lest og vist:

erklære -a arr = ([blekk] = penn [mykt papir] = 'treningsbok' [hardt papir] = "lærebok" [plast] = linjal [spesiell papir] = 42 [tre] = blyant)
ekko $ arr [blekk]
ekko $ arr [mykt papir]
ekko $ arr [hardt papir]
ekko $ arr [plast]
ekko $ arr [spesiell papir]
ekko $ arr [tre]

Utgangen er:

penn
Treningsbok
lærebok
Hersker
42
blyant

Viser alle verdiene i assosiativ matrise

For å vise alle verdiene, kan $ navn [*] eller $ name [@] brukes. I disse uttrykkene er * eller @ i stedet for nøkkelen. Og med det, i stedet for å returnere verdiene til elementene, returneres verdiene til elementer i matrisen. Følgende kode illustrerer dette:

erklære -a arr
arr [mykt papir] = 'treningsbok' arr [plast] = hersker arr [tre] = blyant
ekko $ arr [@]
ekko $ arr [*]

Utgangen er,

Blyantøvelsesboks hersker
Blyantøvelsesboks hersker

Verdienes rekkefølge ved utgang. Legg merke til at @ og * brukt på denne måten er synonymer. Det er et problem med utgangen: setningene er atskilt med mellomrom og kan ikke skilles ut. Følgende kode skiller setningene med komma:

erklære -a arr
arr [mykt papir] = 'treningsbok' arr [plast] = hersker arr [tre] = blyant
Ifs =,
ekko "$ arr [@]"
ekko "$ arr [*]"

Utgangen er nå:

Blyantøvelsesboks hersker
blyant, treningsbok, hersker

IFS betyr internt feltskiller. Det har fått tildelt komma. Legg merke til bruken av doble sitater for $ arr [@] og $ arr [*] i Echo -kommandoene. Komma er inkludert for * abonnementet og ikke for @ -abonnementet. Det er fortsatt et annet problem: i den andre utgangslinjen, der komma har blitt ansatt, har det ikke blitt vist områder. Så, @ og * er ikke synonymer hele tiden. Vel, det er mulig å skille seg med komma og plass - se nedenfor.

Viser alle nøkler med assosiativ matrise

Uttrykket, $ !Navn [@] eller $ !Navn [*] Returnerer nøklene til en matrise som en liste, atskilt med mellomrom. Legg merke til bruken og plasseringen av utropstegn (!). Følgende kode viser bruken av disse uttrykkene:

erklære -a arr
arr [mykt papir] = 'treningsbok' arr [plast] = hersker arr [tre] = blyant
ekko $ !arr [@]
ekko $ !arr [*]

Utgangen er:

TRE Soft Paper Plastic
TRE Soft Paper Plastic

Rekkefølgen på nøklene til den assosiative matrisen trenger ikke å være den samme som deklarert i matrisen.

Antall elementer av assosiativ matrise

Uttrykket gir antall elementer som er satt i en assosiativ matrise, $ #arr [@] eller $ #arr [*], som vist i følgende kode:

erklære -a arr
arr [mykt papir] = 'treningsbok' arr [plast] = hersker arr [tre] = blyant
ekko $ #arr [@]
ekko $ #arr [*]

Utgangen er:

3
3

Legg merke til bruken og plasseringen av symbolet, #.

Viser bare assosiative array -settelementer

Et nøkkelelement tildelt en verdi er satt, mens det som ikke er tildelt en verdi er usett. Følgende kode viser bare verdiene som er angitt:

erklære -a arr
arr [blekk] = penn
$ arr [mykt papir]; arr [mykt papir] = 'treningsbok'
$ arr [hardt papir]
arr [plast] = linjal
$ arr [spesiell papir]
arr [tre] = blyant
for nøkkel i "$ !arr [@] "; gjør
printf "$ arr [$ key],"
Ferdig
ekko

Utgangen er:

blyant, treningsbok, penn, hersker,

Igjen er ikke utgangsposisjoneringen i den rekkefølgen som ble kodet. Merk at “$ !arr [@] ”er i dobbeltkjørt slik at verdier som inneholder mellomrom kan skrives ut. Legg merke til at i $ arr [$ tast] er tasten foregått av $. Printf -kommandoen ligner på Echo -kommandoen, men legger ikke til en ny linje etter å ha vist. Det har vært mulig å skille verdiene ved utgangen, med komma og rom, i en linje. Det siste ekkoet ville føre til at neste utgang går til neste linje.

Innstilling og usiktende assosiative matriseelementer og dets utvalg

Ethvert nøkkelelement som ikke er tildelt en verdi er usett. Et nøkkelelement som har en verdi tilordnet det er satt. Nå kan et element være med vilje usett, som følgende skript viser:

erklære -a arr
arr [mykt papir] = 'treningsbok' arr [plast] = hersker arr [tre] = blyant
useset arr [plast]
for nøkkel i "$ !arr [@] "; gjør
printf "$ arr [$ key],"
Ferdig
ekko

Utgangen er:

blyant, treningsbok,

“Linjal” er ikke vist. Syntaksen for å fjerne et element er:

UNSET ArrayName [Key]

Syntaksen for å fjerne eller fjerne hele den assosiative matrisen er:

Unset ArrayName

eller

Unset ArrayName [@]

eller

Unset ArrayName [*]

I følgende kode er hele matrisen ikke -settet:

erklære -a arr = ([blekk] = penn [mykt papir] = 'treningsbok' [hardt papir] = "tekstbok" [plast] = linjal [spesiell papir] = 42 [tre] = blyant)
Unset arr
ekko "$ arr [*]"

Utgangen er ingenting (en tom linje) fordi hele array.

Viser verdiene til et tilknyttet utvalg

Viser verdiene til et tilknyttet utvalg

erklære -a arr = ([blekk] = penn [mykt papir] = 'treningsbok' [hardt papir] = "tekstbok" [plast] = linjal [spesiell papir] = 42 [tre] = blyant)
for verdi i "$ arr [@]"; gjøre
ekko $ verdi
Ferdig

Utgangen er:

blyant
42
Treningsbok
lærebok
penn
Hersker

Igjen, rekkefølgen verdiene er kodet i en assosiativ matrise, trenger ikke å være den rekkefølgen de vises. Merk at @ har blitt brukt i stedet for * for listevariabelen. Dobbelt sitater har også blitt brukt til listevariabelen.

Konklusjon

En matrise er en liste, enten nummerert eller tastet. Når matrisen er nummerert, er det en indeksert matrise. Når verdiene er plassert med nøkler, er det et assosiativt utvalg. Med den indekserte matrisen begynner nummerering fra null. I databehandling må matrisen kodes. Programmereren trenger å vite hvordan du oppretter matrisen. Han trenger å vite hvordan han kan legge til elementer i matrisen og slette elementer fra matrisen. Han må kunne bestemme antall elementer i matrisen. Og han trenger å vite hvordan han skal slette matrisen.