
Bash-Arrays gehören zu den Features, die einschüchternd wirken, bis du sie einmal benutzt hast. Danach wirst du ständig darauf zurückgreifen, wenn du Skripte schreibst, die Listen von Werten verarbeiten.
Was ist ein Bash-Array?
Ein Bash-Array ist eine Variable, die mehrere Werte speichert. Statt für jeden Eintrag in einer Liste eine eigene Variable zu deklarieren, packst du sie in ein Array und referenzierst sie über Index oder Key. Bash ist es egal, ob die Elemente Strings oder Zahlen sind, und es erzwingt keine einheitlichen Typen.
Indexierte vs. assoziative Arrays
Indexierte Arrays verwenden Integer als Keys, beginnend bei 0. Sie sind der Standard und verhalten sich wie Arrays in den meisten anderen Sprachen. Assoziative Arrays verwenden Strings als Keys und bieten dir Key-Value-Paar-Funktionalität, ähnlich wie Hash Maps oder Dictionaries. Assoziative Arrays erfordern eine explizite Deklaration mit ‚declare -A‘.
Wann du Arrays in Bash-Skripten verwenden solltest
Verwende Arrays, wenn du über eine Liste von Servern, Dateien, Benutzernamen oder einer beliebigen Sammlung von Elementen iterierst. Ohne Arrays landest du bei mehreren Variablen (server1, server2, server3) und Bedingungslogik, die Code dupliziert. Mit einem Array erledigt eine einzige Schleife die gesamte Liste.
Ein Bash-Array deklarieren
Ein indexiertes Array deklarieren
Drei Wege, ein indexiertes Array zu deklarieren:
Alles auf einmal:
fruits=("apple" "banana" "cherry")Einzeln:
fruits[0]="apple" fruits[1]="banana" fruits[2]="cherry"Mit ‚declare‘:
declare -a fruits=("apple" "banana" "cherry")Ein assoziatives Array deklarieren
Assoziative Arrays erfordern die Direktive ‚declare -A‘:
declare -A servers servers[web]="192.168.1.10" servers[db]="192.168.1.20" servers[cache]="192.168.1.30"Oder inline:
declare -A servers=([web]="192.168.1.10" [db]="192.168.1.20")Variablen zu einem Bash-Array hinzufügen
Bei indexierten Arrays fügst du mit dem Operator ‚+=‘ an:
fruits+=("date" "elderberry")Einem bestimmten Index zuweisen:
fruits[5]="fig"Hinweis: Bash-Arrays sind sparse (lückenhaft). Wenn du Index 5 zuweist, obwohl du nur 3 Elemente hast, bleiben die Indizes 3 und 4 ungesetzt, nicht leer.
Array-Elemente referenzieren und ausgeben
Auf ein einzelnes Element zugreifen
Verwende die geschweifte-Klammern-Syntax mit dem Index:
echo ${fruits[0]}Für assoziative Arrays:
echo ${servers[web]}Das gesamte Array ausgeben
Das ‚@‘-Symbol expandiert alle Elemente:
echo ${fruits[@]}Alle Keys anzeigen:
echo ${!fruits[@]}Die Länge des Arrays ermitteln
Stelle ‚#‘ voran, um die Bash-Array-Länge zu erhalten:
echo ${#fruits[@]}Für die String-Länge eines bestimmten Elements:
echo ${#fruits[0]}Bash-Array-Elemente entfernen
Verwende ‚unset‘, um ein bestimmtes Element zu entfernen:
unset fruits[1]Das entfernt das Element, hinterlässt aber die Indexlücke. Die Array-Länge verringert sich um eins. Das gesamte Array entfernen:
unset fruitsDurch ein Bash-Array iterieren
Schleife mit For-In
Der Standardweg, um über Array-Werte zu iterieren:
for fruit in "${fruits[@]}"; do echo "$fruit" doneDie Anführungszeichen um ‚${fruits[@]}‘ sorgen dafür, dass Elemente mit Leerzeichen korrekt behandelt werden. Ohne sie wird ein Element wie ‚passion fruit‘ in zwei Teile aufgesplittet.
Schleife mit Index
Wenn du neben dem Wert auch den Index brauchst:
for i in "${!fruits[@]}"; do echo "Index $i: ${fruits[$i]}" doneDas ‚!‘-Präfix expandiert die Indizes des Arrays statt seiner Werte.
Ein Bash-Array an eine Funktion übergeben
Bash übergibt Arrays nicht nativ an Funktionen. Der Workaround: Übergib den Array-Namen und nutze indirekte Expansion innerhalb der Funktion:
function process_array { local -n arr=$1 for item in "${arr[@]}"; do echo "Processing: $item" done } my_list=("file1" "file2" "file3") process_array my_listDas ‚-n‘-Flag bei ‚local‘ erstellt eine Namensreferenz. Die Funktion arbeitet mit dem Original-Array, ohne es zu kopieren.
FAQ: Bash-Array
Für ein indexiertes Array: fruits=(„apple“ „banana“ „cherry“) Für ein assoziatives Array: declare -A servers=([web]=“192.168.1.10″ [db]=“192.168.1.20″)
Verwende for-in: for item in „${array[@]}“; do echo „$item“; done. Setze „${array[@]}“ immer in Anführungszeichen, um Elemente mit Leerzeichen korrekt zu behandeln.
Verwende ‚${#array[@]}‘. Beispiel: ‚count=${#fruits[@]}‘. Das liefert die Anzahl der Elemente im Array.
Ein assoziatives Array verwendet String-Keys statt Integer-Indizes. Deklariere es mit ‚declare -A‘: declare -A config=([host]=“localhost“ [port]=“3306″). Greife auf Werte mit ‚${config[host]}‘ zu.