Bitte warten...

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.

Code kopieren
daten=(Hund Katze Maus 42 "Indischer Elefant")

Die Werte eines Arrays können Strings und Zahlen sein, aber keine weiteren Arrays. Alternativ lassen sich Daten auch beispielsweise in einer SQLite-Datenbank ablegen (hier für Python erklärt). Dazu wird folgendes Paket benötigt:

sudo apt-get install sqlite3

Installation per apturl symbol: question

Arrays anzeigen

Der Index eines Arrays wird in eckigen Klammern [] geschrieben.

Code kopieren
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.

Code kopieren
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:

Code kopieren
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.

Code kopieren
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.

Code kopieren
# 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:

Code kopieren
# 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.

Code kopieren
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:

Code kopieren
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:

Code kopieren
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.

Code kopieren

Hallo,   Welt!
Foo
Bar
42
---
-e Hallo,   Welt! Foo Bar 42
---

Hallo,
Welt!
Foo
Bar
42
---

Hallo,
Welt!
Foo
Bar
42
---