Bash: Arrays
Arrays sind zusammenhängende Gruppen von Werten, die über ihren Index – die laufende Nummer – angesteuert werden können. Die Zählung der Indizes beginnt mit 0 für das erste Element.
Arrays werden in runden Klammern () definiert. Die einzelnen Elemente werden durch das Leerzeichen getrennt. Enthalten Strings als Element selbst ein Leerzeichen, müssen sie in Anführungszeichen notiert werden.
daten=(Hund Katze Maus 42 "Indischer Elefant")
Arrays anzeigen
Der Index eines Arrays wird in eckigen Klammern [] geschrieben.
echo ${#daten[@]} # 5 (Anzahl der Elemente)
echo ${daten[2]} # Maus (drittes Element mit Index 2)
echo ${daten[@]} # zeigt alle Elemente des Arrays gemeinsam an
for e in "${daten[@]}"; do # zeigt alle Elemente des Arrays einzeln an
echo "$e"
done
Arrays ändern und verketten
Über den entsprechenden Index lassen sich Elemente wieder ändern.
Arrays können auch miteinander verknüpft werden, wobei die Indizes dabei neu zugewiesen werden.
daten[0]=Wolf
daten2=(Vogel Fisch)
daten=("${daten2[@]}" "${daten[@]}") # neues Array am Anfang anfügen
daten+=(Baum Strauch Kraut) # neues Array am Ende anfügen
echo ${daten[@]}
daten3=("${daten[@]}") # neues Array mit allen Elementen aus 'daten' erzeugen
Arrays zerlegen
Es lassen sich auch nur bestimmte Sequenzen des Arrays verwenden:
echo ${daten[@]:2} # alle Elemente ab inklusiv Element 2
echo ${daten[@]:2:4} # 4 Elemente ab inklusiv Element 2
Elemente löschen
Einzelne Elemente können mit der Anweisung unset unter Angabe des entsprechenden Index gelöscht werden. Dabei ist zu beachten, dass die Indizes beim Löschen nicht neu zugewiesen werden! Das Element mit dem gewünschten Index bleibt weiterhin bestehen, ist aber „leer“, es entsteht also eine „Lücke“ und #daten[@] gibt nur noch die Anzahl der nicht leeren Elemente zurück, nicht die Gesamtzahl aller Elemente.
Die Anweisung in Zeile 7 sollte daher nach jedem Löschvorgang mit unset ausgeführt werden, um die Indizes neu zu vergeben.
unset "daten[2]" # löscht Element 2
for ((i=0; i < ${#daten[@]}; i++)); do
echo "$i - ${daten[i]}"
done
daten=("${daten[@]}") # vergibt die Indizes neu
for ((i=0; i < ${#daten[@]}; i++)); do
echo "$i - ${daten[i]}"
done
Eine Reihe zusammenhängender Elemente kann dagegen gelöscht werden, indem ein neues Array erzeugt wird, das aus den Teilen vor und nach den zu löschenden Elementen zusammengesetzt wird.
Natürlich lässt sich diese Methode auch anwenden, um ein einzelnes Element zu löschen und mag in diesem Fall sogar etwas eleganter sein als die Methode mit unset, das ist aber Geschmacksache.
# löscht die Elemente 3 bis 5
start=3
end=5
daten=("${daten[@]:0:start}" "${daten[@]:end + 1}")
# Probe:
for ((i=0; i < ${#daten[@]}; i++)); do
echo "$i - ${daten[i]}"
done
echo ${daten[@]}
Es ist auch möglich, die Elemente in einer Schleife zu löschen, was allerdings mehr Code benötigt:
# löscht die Elemente 3 bis 5
start=3
end=5
for ((i=$start; i <= $end; i++)); do
unset "daten[i]"
done
daten=("${daten[@]}")
# Probe:
for ((i=0; i < ${#daten[@]}; i++)); do
echo "$i - ${daten[i]}"
done
echo ${daten[@]}
Assoziative Arrays
Assoziative Arrays sind Arrays, deren Elemente nicht durch einen fortlaufenden numerischen Index angesprochen werden, sondern durch individuelle Schlüsselwörter.
Ein assoziatives Array wird zunächst mit dem Kommando declare -A deklariert. Anschließend folgt die Zuweisung der Elemente zu der deklarierten Variable (hier: person). Die Elemente werden in runden Klammern () aufgeführt, wobei der jeweilige Schlüssel in eckigen Klammern [] steht. Auf das =-Zeichen folgt dann der Wert.
Weitere Schlüssel/Wert-Paare lassen sich nachträglich durch einfache Zuweisung in der Form Variable[Schlüssel]=Wert hinzufügen. In gleicher Weise können Werte auch geändert werden.
declare -A person
person=(
[Vorname]="Paula"
[Nachname]="Meier"
[Straße]="Hafenstraße"
[Hausnummer]="42a"
[PLZ]=12345
[Ort]="Musterstadt"
[Telefon]=""
)
person[Email]="paula@example.org"
person[Telefon]="12 34 56 78"
echo ${person[@]} # zeigt alle Werte des Arrays an
unset "person[Email]" # löscht das Element 'Email'
Schlüssel eines assoziativen Arrays anzeigen
Die Schlüssel eines assoziativen Arrays lassen sich folgendermaßen anzeigen:
echo "${!person[@]}" # zeigt alle Schlüssel an
# zeigt einzelne Schlüssel und Werte an
for i in ${!person[@]}
do
echo "Schlüssel: $i"
echo "Wert : ${person[$i]}"
done
Die Platzhalter @ und *
Die Operatoren @ und * stehen beide als Platzhalter (Wildcard) für einzelne Elemente eines Arrays. Wie sich die Zeichen unterscheiden, insbesondere, wenn sie gequoted wurden, zeigt folgendes Beispiel:
machwas() {
for e in "$@"; do
echo "${e}"
done
echo "---"
for e in "$*"; do
echo "${e}"
done
echo "---"
for e in $@; do
echo "${e}"
done
echo "---"
for e in $*; do
echo "${e}"
done
echo "---"
}
machwas "-e" "Hallo, Welt!" Foo Bar 42
Die Ausgabe ist entsprechend folgende. Man beachte, dass das erste Argument -e von echo als eigene Option übernommen und daher nicht ausgegeben wird.
Hallo, Welt!
Foo
Bar
42
---
-e Hallo, Welt! Foo Bar 42
---
Hallo,
Welt!
Foo
Bar
42
---
Hallo,
Welt!
Foo
Bar
42
---