Bash-Wörterbücher geben Ihnen Hash-Karten und assoziative Arrays in Linux-Shell-Skripts. Wir zeigen Ihnen, wie Sie diese leistungsstarken und nützlichen Datenstrukturen in Ihren eigenen Linux-Shell-Skripts verwenden.
Eine Rose von einem anderen Namen
Der formale Name für Wörterbücher ist assoziative Arrays. Sie sind auch Hash-Tische und Hash-Karten genannt. Sie sind eine Datenstruktur, die ähnlich wie ein normales Array fungiert, jedoch mit einem signifikanten Unterschied.
Ein Array ist eine Sammlung von Datenwerten, die in einer Datenstruktur gehalten werden. Um auf eine der Datenwerte zuzugreifen, die als Array-Elemente bekannt sind, müssen Sie ihre Position im Array kennen. Die Position eines Array-Elements in dem Array ist als Index bekannt, sodass diese Arten von Arrays als indizierte Arrays bekannt sind. Sie sind die am häufigsten verwendeten Arrays.
Sie haben jedoch einen Nachteil. Wie können Sie auf ein Array-Element zugreifen, wenn Sie seine Position nicht innerhalb der Liste kennen? Sie müssen alle Elemente im Array durchführen, um zu prüfen, ob der Wert an diesem Standort derjenige ist, den Sie suchen.
Assoziative Arrays überwinden dieses Problem. Sie verwenden keine Ganzzahlen, um Array-Elemente eindeutig zu identifizieren. Sie verwenden einzigartige Wörter als Schlüsselwörter. Sie können den Wert für ein Array-Element mithilfe des Schlüsselworts abrufen, unabhängig davon, wo er innerhalb des Arrays positioniert ist. Mit einem indizierten Array sind die intensiven Zahlen, die die Positionen innerhalb des Arrays darstellen, in aufsteigender Reihenfolge. Die Schlüsselwörter in einem assoziativen Array können in beliebiger Reihenfolge sein.
Sie können einen Wert in einem assoziativen Array nachschlagen, indem Sie mit seinem Keyword suchen. Wenn Sie ein Wort aufsuchen, und das Abrufen der zugehörigen Wert-Nachahme, die ein Wort in einem Wörterbuch nachschlagen und seine Bedeutung finden. Deshalb sind assoziative Arrays als Wörterbücher bekannt.
Bash 4.0 oder höher
Assoziative Arrays werden in unterstützt die Bash-Schale Version 4.0 oder höher. Wenn Sie eine aktuelle Linux-Distribution verwenden, sollten Sie in Ordnung sein. Um Ihre Bash-Version zu überprüfen, verwenden Sie diesen Befehl:
Bash -version
Die zur Erforschung dieses Artikels verwendete Maschine hat Bash 5.1.4 installiert, also sind wir gut zu gehen.
Grundprinzipien
Um ein assoziatives Array auf der Terminal-Befehlszeile oder in einem Skript zu erstellen, verwenden wir den Befehl Bash Declare. Die
-EIN
(Associative) Option zeigt an, dass dies ein assoziatives Array ist, und kein indiziertes Array.
Deklarieren Sie -A Akronyme
Dadurch erstellt ein assoziatives Array mit dem Namen "Akronyme".
Um einige Daten in unser Array einzugeben, müssen wir Schlüsselwörter und Werte bereitstellen. Wir können dies mit diesem Format tun:
Array-Name [Schlüssel] = Wert
Fügen wir einige Array-Elemente hinzu:
Akronyme [ACK] = Bestätigung
Akronyme [BGP] = "Border Gateway Protocol"
Akronyme [CIDR] = "Klassenfreie Inter-Domain-Routing"
Akronyme [DHCP] = "Dynamisches Host-Konfigurationsprotokoll"
Akronyme [EOF] = "Ende des Rahmens"
Diese Befehle definieren fünf Array-Elemente. Beachten Sie, dass die Werte in Anführungszeichen eingewickelt sind, wenn im Wert von Leerzeichen vorhanden sind. Unsere Keywords wurden in alphabetischer Reihenfolge eingegeben, können jedoch in beliebiger Reihenfolge eingegeben werden. Die Schlüsselwörter müssen einzigartig sein. Wenn Sie versuchen, zwei Einträge mit demselben Keyword zu erstellen, überschreiben der zweite Wert, den Sie eingeben, den ersten. Sie haben immer noch einen Eintrag mit diesem Keyword, und es wird mit dem zweiten Wert verbunden, den Sie hinzugefügt haben.
Um Werte aus dem Array abzurufen, verwenden wir Befehle in diesem Format:
$ {Array-Name [Key]}
Wir können Echo verwenden, um den Ausgang an das Terminalfenster zu senden:
ECHO $ {Akronyme [ACK]}
ECHO $ {Akronyme [DHCP]}
Verwenden von Schleifen
Arrays verleihen sich sehr gut, um in Loops verwendet zu werden. Assoziative Arrays sind keine Ausnahme. Loops bieten effiziente Möglichkeiten, eine Folge von Aktionen ohne sich wiederholende Codeabschnitte aufzurufen. Bevor wir uns Schlaufen ansehen, gibt es einen effizienten Weg, um Arrays zu erklären.
Wir erstellen die Arrays mit der
erklären
Befehl (das gleiche)
-EIN
Option wie zuvor), aber wir geben die Schlüsselwörter und Werte als Liste auf der Befehlszeile an.
Deklarieren -a Länder = ([Alb] = Albanien [BHR] = Bahrain [CMR] = Cameroon [DNK] = Dänemark [EGY] = Ägypten)
Der Array-Name ist "Länder", und es ist mit einem Equal-Zeichen mit der Wertliste verbunden "
Neigung
. " Die Wertliste ist in Klammern eingewickelt "
()
"Und jedes Schlüsselwort wird in Klammern eingewickelt"
[]
". Beachten Sie, dass keine Kommas die Werte trennen. Wenn Sie über eine Wertezeichenfolge verfügen, die Leerzeichen enthält, müssen Sie es in Anführungszeichen einwickeln.
Um ein assoziatives Array zu erstellen, geben Sie ein Keyword anstelle des Werts zurück, fügen Sie einen Ausrufezeichen hinzu "
Schnitte
"Vor dem Array-Namen. Das AT-Symbol "
@
"Kann als Wildcard verwendet werden, dh alle Array-Elemente.
Dies
zum
Loop listet alle Schlüsselwörter auf:
für den Schlüssel in "$ {! Länder [@]}"; echo $ Key; fertig
Beachten Sie, dass die Schlüsselwörter nicht unbedingt in der Reihenfolge aufgeführt sind, die sie erstellt wurden, aber das spielt keine Rolle. Assoziative Arrays verlassen sich nicht auf einen bestellten Index.
Wir können auch die Parameter-Erweiterung verwenden, um alle Schlüsselwörter aufzulisten. Sie werden in einer Zeile aufgeführt, nicht nur eine pro Zeile.
Echo "$ {! Länder [@]}"
Echo "$ {! Akronyme [@]}"
Wir können unsere ergänzen
zum
Schleife, um die Schlüsselwörter und Werte gleichzeitig zu drucken.
für den Schlüssel in "$ {! Akronyme [@]}"; echo "$ Key - $ {Akronyme [$ KEY]}"; fertig
Wenn wir wissen wollen, wie viele Elemente in den Arrays vorhanden sind, können wir einen Hash "#" vor dem Array-Namen anstelle eines Ausrufespunkts verwenden.
Echo "$ {! Länder [@]}"
Echo "$ {! Akronyme [@]}"
Überprüfen, ob ein Array-Element existiert
Wenn Sie nach einem Keyword suchen, aber kein solches Array-Element gibt, ist der Rückgabewert eine leere Zeichenfolge. Manchmal ist es nützlich, einen anderen Indikator für das Vorhandensein oder Fehlen eines Array-Elements zu haben.
Wir können das Vorhandensein eines Array-Elements mit dem "
+ _
" Operator. Beachten Sie, dass dies nach dem Keyword ist, nicht vor dem Array-Namen wie den vorherigen Bedienern, die wir gesehen haben.
Wenn [$ {Akronyme [EOF] + _}]; dann Echo "gefunden"; else Echo "nicht gefunden"; FI
Wenn [$ {Akronyme [ftp] + _}]; dann Echo "gefunden"; else Echo "nicht gefunden"; FI
Das Array-Element mit dem Schlüsselwort "EOF" befindet sich im Array, aber das Array-Element mit dem Schlüsselwort "FTP" ist nicht.
Hinzufügen von Array-Elementen
Das Hinzufügen neuer Elemente für ein assoziatives Array ist einfach. Im Gegensatz zu einigen Programmiersprachen müssen Sie die Größe Ihres Arrays nicht definieren, wenn Sie ihn angeben. Sie können weiterhin neue Elemente hinzufügen, ohne eine vordefinierte Obergrenze zu treffen.
Um dem Array ein neues Element hinzuzufügen, verwenden wir das "
+ =
" Operator.
Länder + = ([Fji] = Fiji)
Echo "$ (# Länder [@]}"
ECHO $ {länder [fji]}
Die Anzahl der Elemente im Array ist jetzt sechs und sucht nach dem neuen Keyword findet das Array-Element und gibt seinen Wert zurück.
Array-Elemente und Arrays entfernen
Die
einset
Befehl wird verwendet, um Array-Elemente zu entfernen. Wenn das Schlüsselwort Räume darin hat, wickeln Sie es in Anführungszeichen.
UNSET ACRONYMS [EOF]
Wenn [$ {Akronyme [EOF] + _}]; dann Echo "gefunden"; else Echo "nicht gefunden"; FI
So entfernen Sie das gesamte Array, verwenden Sie
einset
mit dem Namen des Arrays.
Unset-Länder
Verwenden von Variablen mit Arrays
Die Verwendung von Variablen mit assoziativen Arrays ist unkompliziert. In diesem Beispiel setzen wir einen Variablenschlüssel auf die Zeichenfolge "EOF". Wir werden die Variable verwenden, wenn wir dem Array ein neues Array-Element hinzufügen. Eigentlich ersetzen wir das Array-Element, das wir früher gelöscht haben.
Wir werden das neue Array-Element abrufen, indem wir es mit dem neuen Keyword und auch mit der Variablen anrufen. Wenn das Schlüsselwort Leerzeichen enthält, müssen Sie den Variablennamen in Anführungszeichen einschließen.
Key = EOF
Akronyme [$ Key] = "Ende des Rahmens"
ECHO $ {Akronyme [EOF]}
ECHO $ {Akronyme [$ KEY]}
Werde kreativ
Unsere Beispiele waren Sammlungen von Informationen, in denen jedes Array-Element unabhängig von allen anderen ist, ähnlich wie ein Wörterbuch. Jeder ist eine eindeutige Definition. Aber assoziative Arrays können genauso problemlos eine Vielzahl von Informationen enthalten, die alle mit einer Sache zusammenhängen, wie z. B. die Spezifikationen verschiedener Computer-Hardware:
-A-Spezifikation deklarieren
Spezifikation [CPU] = "Dual-Core AMD RYZEN 5 3600"
Spezifikation [Geschwindigkeit] = "3600 MHz"
Spezifikation [Kernel] = "5.11.0-17-generisches x86_64"
Spezifikation [MEM] = "1978.5 MIB"
Spezifikation [Speicher] = "32 GIB"
Spezifikation [Shell] = "Bash"
ECHO $ {Spezifikation [CPU]}
Das Schreiben effizient in einer Sprache bedeutet, die Mechanismen und Strukturen zu kennen, die es anbietet, und das am besten geeignete für das Problem, das Sie lösen möchten. Associative Arrays geben Ihnen eine benutzerfreundliche Möglichkeit, Daten zu speichern, mit denen Sie nach Namen suchen können, wie ein Wörterbuch.