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
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.