TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

Verwendung von assoziativen Arrays in Bash

May 21, 2017

Assoziative Arrays sind Datenstrukturen, die Schlüssel-Wert-Paare speichern, ähnlich wie Objekte in JavaScript oder Dictionaries in Python. Sie sind ein mächtiges Werkzeug in Bash-Skripten, um strukturierte Daten zu verwalten.

Wichtiger Hinweis: Assoziative Arrays werden erst ab Bash Version 4.0 unterstützt.


1. Deklaration eines assoziativen Arrays

Ein assoziatives Array muss explizit mit declare -A deklariert werden.

code
# Ein leeres assoziatives Array deklarieren
declare -A user

# Mehrere Arrays deklarieren
declare -A colors sounds

# Ein Array mit initialen Werten deklarieren
declare -A colors=([red]="#ff0000" [green]="#00ff00" [blue]="#0000ff")

2. Werte hinzufügen und auslesen

Werte setzen

code
user[name]="John Doe"
user[email]="john.doe@example.com"

Werte auslesen

Der Zugriff auf einen Wert erfolgt über den Schlüssel. Die Variable muss in geschweiften Klammern stehen.

code
echo "Name: ${user[name]}"
echo "E-Mail: ${user[email]}"

3. Iteration über ein Array

Um alle Schlüssel-Wert-Paare zu durchlaufen, iteriert man über die Liste der Schlüssel.

Über Schlüssel iterieren

code
# Deklariere ein Beispiel-Array
declare -A services=([http]=80 [ssh]=22 [smtp]=25)

# Schleife über alle Schlüssel
for service in "${!services[@]}"; do
  port=${services[$service]}
  echo "Dienst: $service läuft auf Port: $port"
done
  • "${!services[@]}": Diese spezielle Syntax expandiert zu einer Liste aller Schlüssel des Arrays.
  • Die Anführungszeichen sind wichtig, um Schlüssel mit Leerzeichen korrekt zu verarbeiten.

Nur Werte auflisten

code
# Gibt alle Werte zurück
echo "${services[@]}"
# Ausgabe: 80 22 25

Nur Schlüssel auflisten

code
# Gibt alle Schlüssel zurück
echo "${!services[@]}"
# Ausgabe: http ssh smtp

4. Elemente löschen

Einzelnes Element löschen

code
unset 'services[smtp]'

Gesamtes Array löschen

code
unset services

5. Fehlerbehebung

declare: -A: invalid option

Dieser Fehler tritt auf, wenn Sie versuchen, ein assoziatives Array in einer Bash-Version vor 4.0 zu deklarieren. Dies ist häufig auf macOS der Fall, das standardmäßig eine ältere Bash-Version mitliefert.

Lösung für macOS:

  1. Installieren Sie eine aktuelle Bash-Version mit Homebrew:
    code
    brew install bash
    
  2. Verwenden Sie die neue Bash-Version in Ihren Skripten: Ändern Sie den Shebang am Anfang Ihres Skripts, um auf die von Homebrew installierte Bash-Version zu verweisen.
    code
    #!/usr/bin/env bash
    # oder explizit
    #!/usr/local/bin/bash
    
    Stellen Sie sicher, dass /usr/local/bin in Ihrem PATH vor /bin steht.

Fazit

Assoziative Arrays erweitern die Möglichkeiten von Bash-Skripten erheblich, indem sie eine einfache Verwaltung von Schlüssel-Wert-Daten ermöglichen. Voraussetzung ist die Verwendung von Bash 4.0 oder neuer.