Vad är Bash-ordböcker på Linux och hur använder du dem?

0
177
fatmawati achmad zaenuri/Shutterstock.com

Bash-ordböcker ger dig hash-kartor och associerande matriser i Linux-skalskript. Vi visar dig hur du använder dessa kraftfulla och användbara datastrukturer i dina egna Linux-skalskript.

En ros av alla andra Namn

RELATED Vad är Bash Shell och varför är det så viktigt för Linux? Det formella namnet på ordböcker är associerande matriser. De kallas också hashtabeller och hashkartor. De är en datastruktur som fungerar på samma sätt som en vanlig matris, men med en betydande skillnad.

En array är en samling datavärden som hålls i en datastruktur. För att komma åt något av datavärdena, så kallade arrayelement, måste du känna till deras position i arrayen. Ett arrayelements position i arrayen kallas dess index, så dessa typer av arrays kallas indexerade arrays. De är den vanligaste typen av matriser.

De har dock en nackdel. Hur får du tillgång till ett arrayelement om du inte känner till dess position i listan? Du måste gå igenom alla element i matrisen och testa för att se om värdet på den platsen är det som du letar efter.

Associerande matriser löser problemet. De använder inte heltal för att identifiera arrayelement unikt. De använder unika ord som kallas nyckelord. Du kan hämta värdet för ett arrayelement med hjälp av dess nyckelord, oavsett var det är placerat i arrayen. Med en indexerad matris är heltal som representerar positionerna i matrisen i stigande ordning. Nyckelorden i en associerad matris kan vara i valfri ordning.

Du kan slå upp ett värde i en associativ matris genom att söka med dess nyckelord. Att leta upp ett ord och hämta tillhörande värde efterliknar att leta upp ett ord i en ordlista och hitta dess betydelse. Det är därför som associerande matriser kallas ordböcker.

Bash 4.0 eller högre

Associerande matriser stöds i Bash-skalet version 4.0 eller senare. Om du använder en nuvarande Linux-distribution borde du ha det bra. För att kontrollera din Bash-version, använd detta kommando:

bash –version

Annons

Maskinen som används för att undersöka den här artikeln har Bash 5.1.4 installerad, så vi är klara.

Grundläggande principer

Att skapa en associativ array på terminalens kommandorad eller i ett skript använder vi kommandot Bash deklarera. Alternativet -A (associerande) säger till Bash att detta kommer att vara en associerande matris och inte en indexerad matris.

förklara -A akronymer

Detta skapar en associerande matris som kallas & # 8220; akronymer. & # 8221;

För att lägga in lite data i vår matris måste vi ange nyckelord och värden. Vi kan göra detta med det här formatet:

array-name [key] = Värde

Låt oss lägga till några array-element:

acronyms [ACK] = Acknowledgment acronyms [BGP] = “Border Gateway Protocol “acronyms [CIDR] =” Classless Inter-Domain Routing “acronyms [DHCP] =” Dynamic Host Configuration Protocol “acronyms [EOF] =” End of Frame “

Dessa kommandon definierar fem arrayelement. Observera att värdena är inslagna i citattecken om det finns mellanslag i värdet. Våra nyckelord matades in i alfabetisk ordning, men de kan skrivas in i vilken ordning du vill. Nyckelorden måste vara unika. Om du försöker skapa två poster med samma nyckelord kommer det andra värdet som du anger att skriva över det första. Du har fortfarande bara en post med det nyckelordet och det kommer att associeras med det andra värdet som du lade till.

För att hämta värden från matrisen använder vi kommandon i det här formatet:

$ {array-name [key]} Annonsering

Vi kan använda eko för att skicka utdata till terminalfönstret:

echo $ {akronymer [ACK]} echo $ {akronymer [DHCP]}

< h2 role = "heading" aria-level = "2"> Använda loopar

Arrays lämpar sig för att användas i öglor mycket bra. Associerande matriser är inget undantag. Slingor ger effektiva sätt att åberopa en sekvens av åtgärder utan upprepade kodsnitt. Innan vi tittar på slingor finns det ett effektivt sätt att deklarera matriser.

Vi skapar matriserna med kommandot deklarera (samma -A-alternativ som tidigare), men vi tillhandahåller nyckelorden och värdena som en lista på kommandoraden.

förklara -A länder = ([ALB] = Albanien [BHR] = Bahrain [CMR] = Kamerun [DNK] = Danmark [EGY] = Egypten)

Arraynamnet är & # 8220; länder, & # 8221; och den är kopplad till värdelistan med ett likhetstecken & # 8221; =. & # 8221; Värdelistan är insvept inom parentes & # 8220; () & # 8221; och varje nyckelord är hakat inom parentes & # 8220; [] & # 8220 ;. Observera att det inte finns några komma som skiljer värdena. Om du har en värdesträng som innehåller mellanslag, måste du slå den i citattecken.

För att få en associerande matris att returnera ett nyckelord istället för värdet, lägg till ett utropstecken & # 8220;! & # 8221; framför arraynamnet. At-symbolen & # 8220; @ & # 8221; kan användas som jokertecken, vilket betyder alla matriselement.

Detta för loop visar alla nyckelord:

för att skriva in “$ {! länder [@]}”; gör echo $ -tangenten; gjort

Observera att nyckelorden inte nödvändigtvis är listade i ordningen att de skapades, men det spelar ingen roll. Associerande matriser litar inte på ett beställt index.

Annons

Vi kan också använda parameterutvidgning för att lista alla nyckelord. De kommer att listas på en rad, inte en per rad.

echo “$ {! Länder [@]}” echo “$ {! Akronymer [@]}”

Vi kan utöka vår for loop för att skriva ut nyckelorden och värdena samtidigt.

för nyckel i “$ {! akronymer [@]}”; gör echo “$ key – $ {acronyms [$ key]}”; gjort

Om vi ​​vill veta hur många element det finns i matriserna kan vi använda en hash & # 8220; # & # 8221; framför arraynamnet istället för ett utropstecken.

echo “$ {! länder [@]}” echo “$ {! akronymer [@]}”

Kontrollera att ett arrayelement finns

Om du sök efter ett nyckelord men det finns inget sådant arrayelement, returvärdet blir en tom sträng. Ibland är det användbart att ha en annan indikator för närvaro eller frånvaro av ett matriselement.

Vi kan kontrollera om det finns ett array-element med hjälp av & # 8220; + _ & # 8221; operatör. Observera att detta kommer efter nyckelordet, inte framför arraynamnet som de tidigare operatörerna som vi har sett.

om [$ {akronymer [EOF] + _}]; sedan echo “Found”; annars ekar “Inte hittat”; fi if [$ {akronymer [FTP] + _}]; sedan echo “Found”; annars ekar “Inte hittat”; fi

​​

Matriselementet med nyckelordet & # 8220; EOF & # 8221; finns i arrayen, men arrayelementet med nyckelordet & # 8220; FTP & # 8221; är inte.

Lägga till arrayelement

Det är enkelt att lägga till nya element i en associerande matris. Till skillnad från vissa programmeringsspråk behöver du inte definiera storleken på din array när du förklarar den. Du kan fortsätta lägga till nya element utan att nå en fördefinierad övre gräns.

Annons

För att lägga till ett nytt element i matrisen använder vi & # 8220; + = & # 8221; operatör.

länder + = ([FJI] = Fiji) echo “$ (# länder [@]}” echo $ {länder [FJI]}

Antalet element i arrayen är nu sex, och sökning efter det nya nyckelordet hittar arrayelementet och returnerar dess värde.

Ta bort matriselement och matriser

Kommandot unset används för att ta bort matriselement. Om nyckelordet har mellanslag, slå in det med citattecken.

avaktiverade akronymer [EOF] om [$ {akronymer [EOF] + _}]; sedan echo “Found”; annars ekar “Inte hittat”; fi

​​

För att ta bort hela arrayen, använd unset med namnet på arrayen .

avmarkerade länder

Använda variabler med matriser

Att använda variabler med associerande matriser är enkelt. I det här exemplet ställer vi in ​​en variabelnyckel till strängen & # 8220; EOF. & # 8221; Vi använder variabeln när vi lägger till ett nytt arrayelement i arrayen. Vi ersätter faktiskt arrayelementet som vi raderade tidigare.

Vi hämtar det nya arrayelementet genom att anropa det med det nya nyckelordet och även genom att använda variabeln. Om nyckelordet innehåller mellanslag måste du slå in variabelnamnet i citattecken.

key = EOF acronyms [$ key] = “End of Frame” echo $ {acronyms [EOF]} echo $ { akronymer [$ key]}

Bli kreativ

Våra exempel har varit informationssamlingar där varje matriselement är oberoende av alla andra, ungefär som en ordbok. Var och en är en unik definition. Men associerande matriser kan lika enkelt innehålla en mängd olika informationsbitar som är relaterade till en sak, till exempel specifikationerna för olika delar av datorhårdvara:

deklarera -A specifikationsspecifikation [CPU] = “Dual Core AMD Ryzen 5 3600” specifikation [Speed] = “3600 MHz” specification [Kernel] = “5.11.0-17-generic x86_64” specification [Mem] = “1978.5 MiB” specifikation [Storage] = “32 GiB” specifikation [Shell] = “Bash” echo $ {specifikation [CPU]}

Att skriva effektivt på ett språk innebär att känna till de mekanismer och strukturer som det erbjuder och att välja den lämpligaste för det problem som du försöker lösa. Associerande matriser ger dig ett lättanvänt sätt att lagra data som du kan söka efter namn, precis som en ordlista.

LÄS NÄSTA

  • & rsaquo; Androids & # 8220; material du & # 8221; Theming är bra, men förvänta dig inte att Samsung använder det
  • & rsaquo; Så här skapar du en tillfällig vy när du samarbetar i Excel
  • & rsaquo; Så här kontrollerar du .NET Framework-versionen på Windows 10
  • & rsaquo; Vad är färgdjup?
  • & rsaquo; Så här styr du alla dina smarta hemenheter i en app