Bash Dictionaries giver dig hash kort og associative arrays i Linux Shell scripts. Vi viser dig, hvordan du bruger disse kraftfulde og nyttige datastrukturer i dine egne Linux Shell-scripts.
En rose ved ethvert andet navn
Det formelle navn for ordbøger er associative arrays. De kaldes også hash tabeller og hash kort. De er en datastruktur, der fungerer på samme måde som en regelmæssig array, men med en betydelig forskel.
En matrix er en samling af dataværdier, der holdes i en datastruktur. For at få adgang til nogen af dataværdierne, som er kendt som arrayelementer, skal du kende deres position i arrayet. Et arrayelements position i arrayet er kendt som dets indeks, så disse typer af arrays er kendt som indekserede arrays. De er den mest almindeligt anvendte type arrays.
Men de har en ulempe. Hvordan får du adgang til et arrayelement, hvis du ikke kender sin position inden for listen? Du skal løbe gennem alle elementerne i arrayet, teste for at se, om værdien på den pågældende placering er den, du leder efter.
Associative arrays overvinder dette problem. De bruger ikke heltal til entydigt at identificere arrayelementer. De bruger unikke ord kendt som nøgleord. Du kan hente værdien for et arrayelement ved at bruge sit søgeord, uanset hvor det er placeret inden for arrayet. Med et indekseret array er de heltalske tal, der repræsenterer positionerne inden for arrayet, i stigende rækkefølge. Søgeordene i et associativt array kan være i nogen rækkefølge.
Du kan slå en værdi i et associativt array ved at søge med sit søgeord. Kigger op et ord og hentning af dets tilknyttede værdi efterligner et ord i en ordbog og finder dens betydning. Derfor er associerede arrays kendt som ordbøger.
Bash 4.0 eller højere
Associative arrays understøttes i bash shell. version 4.0 eller højere. Hvis du bruger en nuværende Linux-distribution, skal du være i orden. For at kontrollere din bash-version skal du bruge denne kommando:
Bash --Version
Maskinen, der bruges til at undersøge denne artikel, har bash 5.1.4 installeret, så vi er gode til at gå.
Grundlæggende principper
For at oprette et associativt array på terminalkommandolinjen eller i et script, bruger vi kommandoen Bash Declare. Det
-EN
(Associative) Mulighed fortæller Bash, at dette vil være et associativt array og ikke et indekseret array.
Declare -A akronymer
Dette skaber et associativt array kaldet "akronymer".
For at sætte nogle data i vores array skal vi levere nøgleord og værdier. Vi kan gøre dette ved hjælp af dette format:
Array-name [nøgle] = værdi
Lad os tilføje nogle arrayelementer:
Akronymer [ACK] = Bekræftelse
Akronymer [BGP] = "Border Gateway Protocol"
Akronymer [CIDR] = "Klasseløs inter-domæne routing"
Akronymer [DHCP] = "Dynamisk Host Configuration Protocol"
Akronymer [EOF] = "End of Frame"
Disse kommandoer definerer fem arrayelementer. Bemærk, at værdierne er indpakket i citatmærker, hvis der er mellemrum i værdien. Vores søgeord blev indtastet i alfabetisk rækkefølge, men de kan indtastes i enhver rækkefølge, du kan lide. Søgeordene skal være unikke. Hvis du forsøger at oprette to poster med samme søgeord, vil den anden værdi, du indtaster, overskriver den første. Du har stadig kun en post med det pågældende søgeord, og det vil være forbundet med den anden værdi, du tilføjede.
For at hente værdier fra arrayet bruger vi kommandoer i dette format:
$ {array-name [tast]}
Vi kan bruge ECHO til at sende output til terminalvinduet:
ECHO $ {ACRONYMS [ACK]}
ECHO $ {ACRONYMS [DHCP]}
Ved hjælp af løkker
Arrays giver sig til at blive brugt i loops meget godt. Associative arrays er ingen undtagelse. Loops giver effektive måder at påberåbe sig en sekvens af handlinger uden gentagne sektioner af kode. Før vi ser på sløjfer, er der en effektiv måde at erklære arrays.
Vi skaber de arrays ved hjælp af
erklære
kommando (det samme
-EN
Mulighed som før), men vi leverer nøgleordene og værdier som en liste på kommandolinjen.
DECLARE -A LANDER = ([ALB] = Albanien [BHR] = Bahrain [CMR] = Kamerun [DNK] = DANMARK [EGY] = Egypten)
Array-navnet er "Lande", og det er forbundet med værdien af et ligeværdigt tegn "
=
. " Værdilisten er indpakket i parenteser "
()
"Og hvert søgeord er indpakket i parentes"
[]
". Bemærk, at der ikke er kommaer, der adskiller værdierne. Hvis du har en værdestreng, der indeholder mellemrum, skal du pakke den i citatmærker.
For at gøre et associativt array returnere et søgeord i stedet for værdien, tilføj et udråbstegn "
!
"Foran af array-navnet. Den på symbolet "
@
"Kan bruges som et wildcard, hvilket betyder alle arrayelementer.
Det her
til
Loop vil liste alle nøgleordene:
For nøglen i "$ {! Lande [@]}"; gør ekko $ nøgle; gjort
Bemærk, at nøgleordene ikke nødvendigvis er angivet i den rækkefølge, de blev oprettet, men det betyder ikke noget. Associative arrays stoler ikke på et bestilt indeks.
Vi kan også bruge parameterudvidelse til at liste alle nøgleordene. De vil blive noteret på en linje, ikke en pr. Linje.
ECHO "$ {! Lande [@]}"
ECHO "$ {! Akronymer [@]}"
Vi kan øge vores
til
loop for at udskrive søgeordene og værdier på samme tid.
For nøglen i "$ {! Acronymer [@]}"; Gør ekko "$ nøgle - $ {akronymer [$ nøgle]}"; gjort
Hvis vi vil vide, hvor mange elementer der er i arrayerne, kan vi bruge en hash "#" foran array-navnet i stedet for et udråbstegn.
ECHO "$ {! Lande [@]}"
ECHO "$ {! Akronymer [@]}"
Kontrollerer, at der findes et arrayelement
Hvis du søger efter et søgeord, men der ikke er noget sådant arrayelement, vil returværdien være en tom streng. Nogle gange er det nyttigt at have en anden indikator for tilstedeværelsen eller fraværet af et arrayelement.
Vi kan tjekke for tilstedeværelsen af et arrayelement ved hjælp af "
+ _
"Operatør. Bemærk, at dette kommer efter søgeordet, ikke foran array-navnet som de tidligere operatører, vi har set.
Hvis [$ {akronymer [EOF] + _}]; derefter ekko "fundet"; ellers ekko "ikke fundet"; fi
Hvis [$ {akronymer [ftp] + _}]; derefter ekko "fundet"; ellers ekko "ikke fundet"; fi
Arrayelementet med søgeordet "EOF" findes i arrayet, men arrayelementet med søgeordet "FTP" er ikke.
Tilføjelse af arrayelementer
Tilføjelse af nye elementer til et associativt array er nemt. I modsætning til nogle programmeringssprog behøver du ikke at definere størrelsen på dit array, når du erklærer det. Du kan fortsætte med at tilføje nye elementer uden at ramme en foruddefineret øvre grænse.
For at tilføje et nyt element til arrayet bruger vi "
+ =
"Operatør.
lande + = ([FJI] = Fiji)
ECHO "$ (# lande [@]}"
ECHO $ {LANDE [FJI]}
Antallet af elementer i arrayet er nu seks, og søger efter det nye søgeord finder arrayelementet og returnerer sin værdi.
Fjernelse af arrayelementer og arrays
Det
unsuT.
Kommandoen bruges til at fjerne arrayelementer. Hvis søgeordet har mellemrum i det, skal du pakke det i citatmærker.
UNSULED ACRONYMS [EOF]
Hvis [$ {akronymer [EOF] + _}]; derefter ekko "fundet"; ellers ekko "ikke fundet"; fi
For at fjerne hele arrayet, brug
unsuT.
med navnet på arrayet.
UNSET-lande
Ved hjælp af variabler med arrays
Brug af variabler med associative arrays er ligetil. I dette eksempel indstiller vi en variabel nøgle til strengen "EOF." Vi bruger variablen, når vi tilføjer et nyt array-element til arrayet. Faktisk erstatter vi det arrayelement, som vi slettede tidligere.
Vi henter det nye arrayelement ved at kalde det med det nye søgeord og også ved at bruge variablen. Hvis søgeordet indeholder mellemrum, skal du pakke variabeltnavnet i citatmærker.
Key = EOF
Akronymer [$ Key] = "End of Frame"
ECHO $ {ACRONYMS [EOF]}
ekko $ {akronymer [$ nøgle]}
Få Creative
Vores eksempler har været samlinger af oplysninger, hvor hvert arrayelement er uafhængigt af alle de andre, ligesom en ordbog. Hver enkelt er en unik definition. Men associative arrays kan lige så nemt holde en række oplysninger, der alle er relateret til en ting, såsom specifikationerne for forskellige stykker computerhardware:
Declare -E-specifikation
Specifikation [CPU] = "Dual Core Amd Ryzen 5 3600"
Specifikation [Speed] = "3600 MHz"
Specifikation [kernel] = "5.11.0-17-generisk x86_64"
Specifikation [MEM] = "1978.5 MIB"
Specifikation [Opbevaring] = "32 GIB"
Specifikation [Shell] = "Bash"
ECHO $ {Specifikation [CPU]}
Skrive effektivt på et sprog betyder at kende de mekanismer og strukturer, den tilbyder, og vælge den mest hensigtsmæssige til det problem, du forsøger at løse. Associative arrays giver dig en nem at bruge måde at lagre data, som du kan søge efter navn, ligesom en ordbog.