Assoziative Arrays in Bash

Fenster mit Quellcode

Mit bash 4.0 und höher hat man die Möglichkeit Assoziative Arrays verwenden zu können. In Python werden diese Art von Datenstrukturen Dictionaries genannt, in Perl heissen diese Hashes. Im Prinzip sind assoziative Arrays eine Erweiterung von normalen (indizierten) Arrays. Diese werden in der Regel dann eingesetzt, wenn man Arrayeinträge über vorher definierte Zeichenketten wiederfinden möchte.

 

Der Unterschied zu den indizierten Arrays besteht darin, dass bei den assoziativen Arrays nicht fortlaufende Nummern als Indizes, sondern sogenannte Keys (engl. Schlüssel) benutzt werden, die neben Zahlen auch Zeichenketten beinhalten können. Die einzelnen Arrayelemente werden demnach nicht einfach durchnummeriert, sondern jedes Element erhält eine Zeichenkette als Index.

Wollte man z.B. die Homeverzeichnisse von fünf Benutzern in einem Array abspeichern, musste man ein wenig tricksen um diese Infromationen pro Benutzer auch wieder auslesen zu können. Im folgenden Beispiel wird einfach definiert, dass in den ungeraden Indicies die Benutzernamen stehen und in den geraden Indicies die Pfade zu den Homeverzeichnissen.

#!/bin/bash

declare -a homeverzeichnis

homeverzeichnis[1]=matse
homeverzeichnis[2]=/home/matse
homeverzeichnis[3]=glatze
homeverzeichnis[4]=/to/boldly/go/patrick_stewart
homeverzeichnis[5]=fratze
homeverzeichnis[6]=/home/nightmare/freddy
homeverzeichnis[7]=james
homeverzeichnis[8]=/home/bond
homeverzeichnis[9]=bond
homeverzeichnis[10]=/007

echo "Benutzer 'fratze' hat folgendes homeverzeichnis:"

found=0
index=1

until [ $found -eq 1 ];do
if [ "${homeverzeichnis[${index}]}" = "fratze" ];then
echo ${homeverzeichnis[$(( ${index} + 1 ))]}
found=1
fi
index=$(( ${index} + 1 ))
done

Wie man sieht, ist das relativ umständlich. Einfacher geht dies seit Bash 4.0. Hierbei deklariert man zuerst ein Assoziatives Array mittels:

declare -A homeverzeichnis

Danach kann man einfach das Array füllen indem man als Schlüssel den Benutzernamen und als Wert den Pfad zum Homeverzeichnis definiert.

homeverzeichnis[matse]=/home/matse
homeverzeichnis[glatze]=/to/boldly/go/patrick_stewart
[etc.]

Das fertige Script sieht dann folgendermassen aus:

#!/bin/bash

declare -A homeverzeichnis

homeverzeichnis[matse]=/home/matse
homeverzeichnis[glatze]=/to/boldly/go/patrick_stewart
homeverzeichnis[fratze]=/home/nightmare/freddy
homeverzeichnis[james]=/home/bond
homeverzeichnis[bond]=/007

echo "Benutzer 'fratze' hat folgendes homeverzeichnis:"
echo "${homeverzeichnis[fratze]}"

Zum Schluss noch ein kleiner Tipp. Will man jeweils die Liste aller Schlüssel oder Werte erhalten, kann man folgendermassen vorgehen:

Eine Liste aller Keys eines Arrays erhält man mittels:

echo ${!homeverzeichnis[@]}

Eine Liste aller Werte eines Arrays erhält man mittels:

echo ${homeverzeichnis[@]}