Was sind Bash-Wörterbücher unter Linux und wie werden sie verwendet?

Ein stilisierter Laptop, der ein Terminal mit Textzeilen zeigt.

Bash-Wörterbücher bieten Ihnen Hash-Maps und assoziative Arrays in Linux-Shell-Skripten. Wir zeigen Ihnen, wie Sie diese leistungsstarken und nützlichen Datenstrukturen in Ihren eigenen Linux-Shell-Skripten verwenden.

Eine Rose mit einem anderen Namen

Was ist die Bash-Shell und warum ist sie für Linux so wichtig?

VERBUNDENWas ist die Bash-Shell und warum ist sie für Linux so wichtig?

Der formale Name für Wörterbücher ist assoziative Arrays. Sie werden auch Hash-Tabellen und Hash-Maps genannt. Sie sind eine Datenstruktur, die ähnlich wie ein reguläres Array funktioniert, jedoch mit einem wesentlichen Unterschied.

Ein Array ist eine Sammlung von Datenwerten, die in einer Datenstruktur gespeichert sind. Um auf einen der Datenwerte zuzugreifen, die als Array-Elemente bekannt sind, müssen Sie deren Position im Array kennen. Die Position eines Array-Elements im Array wird als Index bezeichnet, daher werden diese Array-Typen als indizierte Arrays bezeichnet. Sie sind die am häufigsten verwendete Art von Arrays.

Sie haben jedoch einen Nachteil. Wie greifen Sie auf ein Array-Element zu, wenn Sie seine Position innerhalb der Liste nicht kennen? Sie müssen alle Elemente im Array durchlaufen und testen, ob der Wert an dieser Stelle der gesuchte Wert ist.

Assoziative Arrays lösen dieses Problem. Sie verwenden keine Ganzzahlen, um Array-Elemente eindeutig zu identifizieren. Sie verwenden eindeutige Wörter, die als Schlüsselwörter bekannt sind. Sie können den Wert für ein Array-Element mithilfe seines Schlüsselworts abrufen, unabhängig davon, wo es innerhalb des Arrays positioniert ist. Bei einem indizierten Array sind die ganzen 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 Schlüsselwort suchen. Das Nachschlagen eines Wortes und das Abrufen seines zugehörigen Wertes ahmt das Nachschlagen eines Wortes in einem Wörterbuch und das Finden seiner Bedeutung nach. Aus diesem Grund werden assoziative Arrays als Wörterbücher bezeichnet.

Bash 4.0 oder höher

Assoziative Arrays werden in der Bash-Shell-Version 4.0 oder höher unterstützt. 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

Auf dem Computer, auf dem dieser Artikel recherchiert wurde, ist Bash 5.1.4 installiert, also können wir loslegen.

Grundprinzipien

Um ein assoziatives Array in der Terminal-Befehlszeile oder in einem Skript zu erstellen, verwenden wir den Bash-Befehl deklarieren. Das -A Die Option (assoziativ) teilt Bash mit, dass es sich um ein assoziatives Array und nicht um ein indiziertes Array handelt.

declare -A acronyms

Dadurch wird ein assoziatives Array namens „Akronyme“ erstellt.

Verwandt :  So reparieren Sie Ihre Festplatte, nachdem Sie sie für Xbox One verwendet haben

Um einige Daten in unser Array einzufügen, müssen wir Schlüsselwörter und Werte bereitstellen. Wir können dies mit diesem Format tun:

array-name[key]=Value

Fügen wir einige Array-Elemente hinzu:

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

Diese Befehle definieren fünf Array-Elemente. Beachten Sie, dass die Werte in Anführungszeichen eingeschlossen sind, wenn der Wert Leerzeichen enthält. Unsere Schlüsselwörter wurden in alphabetischer Reihenfolge eingegeben, können jedoch in beliebiger Reihenfolge eingegeben werden. Die Schlüsselwörter müssen eindeutig sein. Wenn Sie versuchen, zwei Einträge mit demselben Schlüsselwort zu erstellen, überschreibt der zweite eingegebene Wert den ersten. Sie haben immer noch nur einen Eintrag mit diesem Schlüsselwort, der mit dem zweiten hinzugefügten Wert verknüpft ist.

Um Werte aus dem Array abzurufen, verwenden wir Befehle in diesem Format:

${array-name[key]}

Wir können echo verwenden, um die Ausgabe an das Terminalfenster zu senden:

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

Schleifen verwenden

Arrays eignen sich sehr gut für die Verwendung in Schleifen. Assoziative Arrays sind keine Ausnahme. Schleifen bieten effiziente Möglichkeiten zum Aufrufen einer Sequenz von Aktionen ohne sich wiederholende Codeabschnitte. Bevor wir uns Schleifen ansehen, gibt es eine effiziente Möglichkeit, Arrays zu deklarieren.

Wir erstellen die Arrays mit dem declare Befehl (das gleiche -A Option wie zuvor), aber wir stellen die Schlüsselwörter und Werte als Liste in der Befehlszeile bereit.

declare -A countries=( [ALB]=Albania [BHR]=Bahrain [CMR]=Cameroon [DNK]=Denmark [EGY]=Egypt )

Der Array-Name lautet „Länder“ und ist durch ein Gleichheitszeichen mit der Werteliste verbunden. =.“ Die Werteliste ist in Klammern eingeschlossen „()“ und jedes Schlüsselwort ist in Klammern eingeschlossen “[]“. Beachten Sie, dass die Werte durch keine Kommas getrennt werden. Wenn Sie eine Wertzeichenfolge haben, die Leerzeichen enthält, müssen Sie sie in Anführungszeichen setzen.

Damit ein assoziatives Array ein Schlüsselwort anstelle des Werts zurückgibt, fügen Sie ein Ausrufezeichen „!“ vor dem Array-Namen. Das at-Symbol „@” kann als Platzhalter verwendet werden, d. h. alle Array-Elemente.

Diese for loop listet alle Schlüsselwörter auf:

for key in "${!countries[@]}"; do echo $key; done

Beachten Sie, dass die Schlüsselwörter nicht unbedingt in der Reihenfolge aufgeführt sind, in der sie erstellt wurden, aber das spielt keine Rolle. Assoziative Arrays verlassen sich nicht auf einen geordneten Index.

Wir können auch die Parametererweiterung verwenden, um alle Schlüsselwörter aufzulisten. Sie werden in einer Zeile aufgelistet, nicht einer pro Zeile.

echo "${!countries[@]}"
echo "${!acronyms[@]}"

Wir können unsere for Schleife, um die Schlüsselwörter und Werte gleichzeitig auszugeben.

for key in "${!acronyms[@]}"; do echo "$key - ${acronyms[$key]}"; done

Wenn wir wissen möchten, wie viele Elemente sich in den Arrays befinden, können wir anstelle eines Ausrufezeichens eine Raute „#“ vor dem Arraynamen verwenden.

echo "${!countries[@]}"
echo "${!acronyms[@]}"

Prüfen, ob ein Array-Element vorhanden ist

Wenn Sie nach einem Schlüsselwort suchen, aber kein solches Array-Element vorhanden ist, 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.

Verwandt :  So entfernen Sie Bloatware ganz einfach von Ihrem Android-Gerät – Guiding Tech

Wir können das Vorhandensein eines Array-Elements mit dem „+_“ Operator. Beachten Sie, dass dies nach dem Schlüsselwort und nicht vor dem Array-Namen steht, wie bei den vorherigen Operatoren, die wir gesehen haben.

if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi
if [ ${acronyms[FTP]+_} ]; then echo "Found"; else echo "Not found"; fi

Das Array-Element mit dem Schlüsselwort „EOF“ wird im Array gefunden, das Array-Element mit dem Schlüsselwort „FTP“ jedoch nicht.

Hinzufügen von Array-Elementen

Das Hinzufügen neuer Elemente zu einem assoziativen Array ist einfach. Im Gegensatz zu einigen Programmiersprachen müssen Sie die Größe Ihres Arrays nicht definieren, wenn Sie es deklarieren. Sie können immer wieder neue Elemente hinzufügen, ohne eine vordefinierte Obergrenze zu erreichen.

Um dem Array ein neues Element hinzuzufügen, verwenden wir das „+=“ Operator.

countries+=( [FJI]=Fiji )
echo "$(#countries[@]}"
echo ${countries[FJI]}

Die Anzahl der Elemente im Array beträgt jetzt sechs, und die Suche nach dem neuen Schlüsselwort findet das Array-Element und gibt seinen Wert zurück.

Entfernen von Array-Elementen und Arrays

Das unset Befehl wird verwendet, um Array-Elemente zu entfernen. Wenn das Schlüsselwort Leerzeichen enthält, setzen Sie es in Anführungszeichen.

unset acronyms[EOF]
if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi

Um das gesamte Array zu entfernen, verwenden Sie unset mit dem Namen des Arrays.

unset countries

Verwenden von Variablen mit Arrays

Die Verwendung von Variablen mit assoziativen Arrays ist unkompliziert. In diesem Beispiel setzen wir einen variablen Schlüssel auf die Zeichenfolge „EOF“. Wir verwenden die Variable, wenn wir dem Array ein neues Array-Element hinzufügen. Tatsächlich ersetzen wir das Array-Element, das wir zuvor gelöscht haben.

Wir rufen das neue Array-Element ab, indem wir es mit dem Schlüsselwort new aufrufen und auch die Variable verwenden. Wenn das Schlüsselwort Leerzeichen enthält, müssen Sie den Variablennamen in Anführungszeichen setzen.

key=EOF
acronyms[$key]="End of Frame"
echo ${acronyms[EOF]}
echo ${acronyms[$key]}

Werde kreativ

Unsere Beispiele waren Sammlungen von Informationen, bei denen jedes Array-Element unabhängig von allen anderen ist, ähnlich wie ein Wörterbuch. Jeder ist eine einzigartige Definition. Aber assoziative Arrays können genauso gut eine Vielzahl von Informationen enthalten, die sich alle auf eine Sache beziehen, wie zum Beispiel die Spezifikationen verschiedener Computerhardware:

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

Effizient in einer Sprache zu schreiben bedeutet, die Mechanismen und Strukturen zu kennen, die sie bietet, und die für das zu lösende Problem am besten geeignete auszuwählen. Assoziative Arrays bieten Ihnen eine einfach zu verwendende Möglichkeit zum Speichern von Daten, die Sie wie ein Wörterbuch nach Namen durchsuchen können.