Bash-ordböcker ger dig hash-kartor och associativa arrays i Linux Shell-skript. Vi visar hur du använder dessa kraftfulla och användbara datastrukturer i dina egna Linux Shell-skript.
En ros med något annat namn
Det formella namnet för ordböcker är associativa arrays. De kallas också hash tabeller och hash kartor. De är en datastruktur som fungerar på samma sätt som en vanlig array, men med en signifikant skillnad.
En array är en samling datavärden som hålls i en datastruktur. För att få tillgång till något av datavärdena, som är kända som arrayelement, behöver du veta deras position i matrisen. Ett matriselement i arrayen är känt som sitt index, så dessa typer av arrays är kända som indexerade arrays. De är den vanligaste typen av arrays.
De har dock en nackdel. Hur får du tillgång till ett arrayelement om du inte känner till sin position inom listan? Du måste springa igenom alla element i matrisen, testning för att se om värdet på den platsen är den som du letar efter.
Associativa arrays övervinner den frågan. De använder inte heltal för att unikt identifiera matriselement. De använder unika ord som kallas nyckelord. Du kan hämta värdet för ett arrayelement med hjälp av sitt sökord, oavsett var den är placerad i arrayen. Med en indexerad array är heltalsnumren som representerar positionerna i arrayen i stigande ordning. Nyckelord i en associativ array kan vara i vilken ordning som helst.
Du kan leta upp ett värde i en associativ array genom att söka med sitt sökord. Letar upp ett ord och hämtar dess associerade värde mimics tittar upp ett ord i en ordlista och hitta sin mening. Därför är associativa arrays kända som ordböcker.
Bash 4,0 eller högre
Associativa arrays stöds i Bash Shell version 4.0 eller högre. Om du använder en aktuell Linux-distribution, borde du vara bra. För att kontrollera din bash-version, använd det här kommandot:
Bash - version
Maskinen som används för att undersöka den här artikeln har bash 5.1.4 installerad, så vi är bra att gå.
Grundläggande principer
För att skapa en associativ array på den terminala kommandoraden eller i ett skript, använder vi Bash-deklarationen. De
-A
(Associativ) Alternativ berättar Bash att detta kommer att vara en associativ array och inte en indexerad array.
Förklara -A-akronymer
Detta skapar en associativ array som heter "akronymer".
För att sätta vissa data i vår array måste vi tillhandahålla sökord och värderingar. Vi kan göra detta med det här formatet:
Array-Namn [tangent] = värde
Låt oss lägga till några arrayelement:
Acronyms [ACK] = Bekräftelse
Acronyms [BGP] = "Border Gateway Protocol"
Acronyms [cidr] = "Classless inter-domain routing"
Acronyms [DHCP] = "Dynamisk värdkonfigurationsprotokoll"
akronymer [EOF] = "Slut på ramen"
De kommandon definierar fem arrayelement. Observera att värdena är inslagna i citattecken om det finns mellanslag i värdet. Våra nyckelord har skrivits in i alfabetisk ordning, men de kan anges i vilken ordning du vill ha. Nyckelorden måste vara unika. Om du försöker skapa två poster med samma sökord, skrivs det andra värdet som du anger det första. Du har fortfarande bara en post med det sökordet, och det kommer att vara associerat med det andra värdet som du lagt till.
För att hämta värden från arrayen använder vi kommandon i detta format:
$ {ARRAY-NAME [KEY]}
Vi kan använda ECHO för att skicka utgången till terminalfönstret:
Echo $ {Acronyms [ACK]}
Echo $ {Acronyms [DHCP]}
Med hjälp av loopar
Arrayer lämpar sig för att användas i slingor mycket väl. Associativa arrayer är inget undantag. Loops ger effektiva sätt att åberopa en följd av åtgärder utan repetitiva delar av koden. Innan vi tittar på loopar, finns det ett effektivt sätt att deklarera matriser.
Vi skapar arrayer med hjälp av
deklarera
kommandot (samma
-A
alternativ som tidigare), men vi ger de sökord och värden som en lista på kommandoraden.
förklara -A länder = ([ALB] = Albanien [BHR] = Bahrain [CMR] = Kamerun [DNK] = Danmark [EGY] = Egypten)
Matrisen heter ”länder”, och den är ansluten till värdelistan med ett likhetstecken”
=
. Värdelistan är insvept inom parentes ”
()
”Och varje sökord är insvept i parentes”
[]
”. Observera att det inte finns några kommatecken separera värdena. Om du har ett värde sträng som innehåller mellanslag, måste du packa in den i citattecken.
För att göra en associativ array tillbaka ett sökord i stället för värdet, lägga ett utropstecken ”
!
”Framför arrayen namn. Den vid symbolen ”
@
”Kan användas som ett jokertecken, vilket betyder alla gruppelement.
Detta
för
loop kommer att lista alla nyckelord:
för knappa in "$ {länder [@]!}"; gör echo $ nyckel; gjort
Observera att sökorden inte nödvändigtvis är listade i den ordning som de skapades, men det spelar ingen roll. Associativa arrayer inte lita på en ordnad index.
Vi kan också använda parameter expansionen för att lista alla sökord. De kommer att visas på en rad, inte ett per rad.
echo "$ {! Länder [@]}"
echo "$ {! Akronymer [@]}"
Vi kan öka vår
för
slinga för att skriva ut nyckelord och värden samtidigt.
för nyckeln i "$ {akronymer [@]!}"; gör echo "$ nyckel - $ {akronymer [$ key]}"; gjort
Om vi vill veta hur många element som finns i matriserna, kan vi använda en hash ”#” framför matrisen namn istället för ett utropstecken.
echo "$ {! Länder [@]}"
echo "$ {! Akronymer [@]}"
Kontrollera att en Array Element Finns
Om du söker efter ett sökord, men det finns ingen sådan array element, kommer returvärdet vara en tom sträng. Ibland är det användbart att ha en annan indikator för närvaro eller frånvaro av ett grupperingselement.
Vi kan kontrollera förekomsten av ett fältelement med hjälp av ”
+ _
”Operatör. Observera att detta kommer efter nyckelordet, inte framför arrayen namn som de tidigare operatörerna vi har sett.
Om [$ {akronymer [EOF] + _}]; sedan echo "hittades"; annars echo "Not found"; fi
Om [$ {akronymer [FTP] + _}]; sedan echo "hittades"; annars echo "Not found"; fi
Arrayen element med nyckelordet ”EOF” finns i arrayen, men arrayelementet med sökordet ”FTP” inte är.
Tillsats arrayelement
Tillägg av nya delar till en associativ array är lätt. Till skillnad från vissa programmeringsspråk, behöver du inte definiera storleken på din array när du förklara den. Du kan fortsätta att lägga till nya element utan att slå ett fördefinierat övre gräns.
För att lägga till ett nytt element i arrayen, använder vi ”
+ =
”Operatör.
länder + = ([FJI] = Fiji)
echo "$ (# länder [@]}"
echo $ {länder [FJI]}
Antalet element i arrayen är nu sex, och söker efter den nya sökordet finner arrayen elementet och returnerar dess värde.
Ta bort arrayelement och matriser
De
oskränkt
Kommandot används för att avlägsna arrayelementen. Om sökordet har utrymmen i den, linda in det i citattecken.
oskränkt akronymer [EOF]
Om [$ {akronymer [EOF] + _}]; sedan echo "hittades"; annars echo "Not found"; fi
Att ta bort hela arrayen, användning
oskränkt
med namnet på arrayen.
oskränkta länder
Använda variabler med arrayer
Använda variabler med associativa arrayer är okomplicerad. I det här exemplet kommer vi att ställa in en variabel nyckel till strängen ”EOF”. Vi kommer att använda variabeln när vi lägger till en ny array element i arrayen. Egentligen vi ersätta matrisen element som vi bort tidigare.
Vi hämtar det nya arrayelementet genom att ringa det med det nya sökordet och också med hjälp av variabeln. Om sökordet innehåller mellanslag måste du fälla det variabla namnet i citattecken.
Key = EOF
Acronyms [$-nyckel] = "Slut på ramen"
Echo $ {Acronyms [EOF]}
Echo $ {Acronyms [$ Key]}
Bli kreativitet
Våra exempel har varit samlingar av information där varje arrayelement är oberoende av alla andra, mycket som en ordbok. Var och en är en unik definition. Men associativa arrays kan lika enkelt hålla en mängd olika bitar av information som är relaterade till en sak, till exempel specifikationerna för olika bitar av datorhårdvara:
Förklara -A-specifikationen
Specifikation [CPU] = "Dual Core AMD RYZEN 5 3600"
Specifikation [Speed] = "3600 MHz"
Specifikation [kärna] = "5.11.0-17-generisk X86_64"
Specifikation [MEM] = "1978.5 MIB"
Specifikation [Förvaring] = "32 GIB"
Specifikation [Shell] = "Bash"
Echo $ {Specifikation [CPU]}
Skriva effektivt på ett språk innebär att man känner till de mekanismer och strukturer som den erbjuder och väljer den mest lämpliga för det problem du försöker lösa. Associativa arrays ger dig ett lättanvänt sätt att lagra data som du kan söka efter namn, precis som en ordbok.