Wie man mit Arrays in Bash-Skripten arbeitet

Indeks
  1. Ein Array deklarieren
  2. Durch ein Array iterieren
  3. Verschiedene Arten von Arrays in Bash
    1. Indizierte Arrays
    2. Assoziative Arrays
    3. Spärliche Arrays
  4. Zugriff, Modifizierung und Löschen von Array-Elementen
  5. Einige erweiterte Array-Tricks
    1. Slicing
    2. Kopieren und Kombinieren
    3. Sortieren
    4. Duplikate Entfernen
    5. Arrays Filtern

Arrays in Bash erleichtern die Arbeit mit großen Datenmengen in Skripten. Sie ermöglichen die Speicherung mehrerer Werte in einer Variable und verbessern die Effizienz.

Wenn Sie mit einer großen Menge an Daten in Ihren Bash-Skripten arbeiten, werden Ihnen Arrays das Leben erheblich erleichtern. Einige Menschen sind von der Syntax eingeschüchtert. Doch einmal gelernt, machen sie Ihre Skripte leistungsfähiger, mit weniger Variablen, über die man nachdenken muss.

Ein Array deklarieren

Arrays in Bash ermöglichen es Ihnen, mehrere Daten in einer einzigen Variablen zu speichern, ähnlich wie eine Liste in Python. Dies macht sie zu mächtigen Werkzeugen für das Verwalten von zusammengehörenden Werten wie Dateinamen, Benutzernamen, Konfigurationsoptionen oder Kommandozeilenargumenten.

Im Gegensatz zu vielen anderen Programmiersprachen müssen Sie in Bash den Array-Typ nicht explizit deklarieren. Sie weisen einfach Werte mit einer spezifischen Syntax zu, und Bash erkennt es als Array. Die Deklarationsmethode variiert je nach Array-Typ (siehe später).

Um ein indiziertes Array zu deklarieren, was die häufigste Art von Array ist, geben Sie einfach den Namen, ein Gleichheitszeichen und Klammern ein.

arr=()

Das war's. Sie haben gerade ein leeres Array deklariert. Sie können seine Elemente mit dem echo-Befehl anzeigen, so:

echo $arr

Da es keine Elemente gibt, sehen Sie nur eine leere Zeile. Sie können Werte in derselben Zeile dem Array zuweisen. Geben Sie dazu ein durch Leerzeichen getrenntes Element innerhalb der Klammern ein.

fruits=("apple" "banana" "cherry")

Jeder durch ein Leerzeichen getrennte Wert wird zu einem Element des Arrays. Sie können es mit:

echo "${fruits[@]}"

verifizieren. Sie können auch ein leeres Array deklarieren und später Elemente hinzufügen.

fruits=()
fruits+=("apple")
fruits+=("banana" "cherry")

Das Drucken des Arrays zeigt die neu hinzugefügten Elemente an.

Dieser Ansatz ist praktisch, wenn Sie das Array dynamisch füllen müssen. Sie können auch einzelnen Elemente nach Index zuweisen.

fruits[0]="apple"
fruits[1]="banana"
fruits[2]="cherry"

Eine andere Möglichkeit, ein Array zu deklarieren, besteht darin, das declare-Kommando zu verwenden, um explizit ein indiziertes Array zu definieren.

declare -a colors=("red" "green" "blue")

Dies macht deutlich, dass 'colors' als Array gedacht ist, was in größeren Skripten nützlich sein kann. Um zu bestätigen, ob eine Bash-Variable ein Array ist (und welcher Art), verwenden Sie den Befehl declare -p.

Dies ist besonders nützlich beim Debuggen von Skripten.

Durch ein Array iterieren

Sobald Sie ein Array deklariert haben, möchten Sie normalerweise etwas mit seinen Elementen tun: sie drucken, verarbeiten oder an Befehle übergeben. In Bash gibt es mehrere Möglichkeiten, durch Arrays zu iterieren, und das Verständnis dieser Ansätze ist entscheidend für das Schreiben flexibler, fehlerfreier Skripte.

Die häufigste Methode, um jedes Element in einem Array zu durchlaufen, ist eine einfache Bash-For-Schleife.

fruits=("apple" "banana" "cherry")

for fruit in "${fruits[@]}"; do
 echo "Ich mag $fruit"
done

Dies ist großartig, um die Werte zu durchlaufen. Aber was ist, wenn Sie auch die Indizes benötigen? Dafür können Sie eine C-artige For-Schleife verwenden, so:

for ((i=0; i<${#fruits[@]}; i++)); do
 echo "Frucht #$i ist ${fruits[$i]}"
done

Dies ist ideal, wenn Sie sowohl Position als auch Wert benötigen. Um nur die Indizes zu erhalten, können Sie die spezielle Erweiterung ${!array[@]} verwenden, so:

for index in "${!fruits[@]}"; do
 echo "Index $index = ${fruits[$index]}"
done

Diese Technik ist auch praktisch, wenn das Array nicht sequenziell ist (zum Beispiel, wenn einige Elemente entfernt wurden). Wenn Ihr Array aus der Ausgabe eines Befehls stammt, kann eine while read-Schleife effizienter oder sauberer sein.

printf '%s\n' "${lines[@]}" | while read -r file; do
 echo "Verarbeite $file"
done

Dieser Ansatz ist hervorragend, wenn Sie Daten dynamisch aus Befehlen oder Dateien lesen. Ein weiterer interessanter Trick ist, dass Sie mehrere Arrays gemeinsam durchlaufen können. Hier ist ein Beispiel:

names=("Alice" "Bob" "Charlie")
ages=(25 30 35)

for ((i=0; i echo "${names[$i]} ist ${ages[$i]} Jahre alt"
done

Wenn Sie mehrere Arrays zusammen durchlaufen, stellen Sie immer sicher, dass sie die gleiche Länge haben.

Verschiedene Arten von Arrays in Bash

Bash-Arrays gibt es in verschiedenen Varianten, und das Verständnis ihrer Unterschiede hilft Ihnen, das richtige Werkzeug für Ihr Skript auszuwählen. Bash unterstützt zwei Haupttypen von Arrays:

    1. Indizierte Arrays: Standard.
      1. Indizierte Arrays: nummerisch indizierte Listen.
      2. Assoziative Arrays: Schlüssel-Werte-Paare, die durch Strings indiziert sind.

Es gibt auch einen speziellen Typ, der erwähnenswert ist, sogenannte spärliche Arrays, bei denen die numerischen Indizes nicht sequenziell sind. Lassen Sie uns jeden Typ durchgehen.

Indizierte Arrays

Indizierte Arrays sind der häufigste Typ, ideal, wenn Sie geordnete Listen wie Dateinamen, Benutzer-IDs oder Zahlen speichern möchten. Jedes Element wird durch einen ganzzahligen Index identifiziert, der bei 0 beginnt.

fruits=("apple" "banana" "cherry")

echo "${fruits[0]}"
echo "${fruits[1]}"

Sie können alle Elemente auf einmal anzeigen oder die Anzahl der Elemente überprüfen:

echo "${fruits[@]}"
echo "${#fruits[@]}"

Indizierte Arrays sind nützlich, wenn Sie eine Liste mit natürlicher Reihenfolge haben oder Ergebnisse von Befehlen durchlaufen möchten.

Assoziative Arrays

Assoziative Arrays funktionieren wie Wörterbücher oder Hashmaps in vielen anderen Sprachen. Sie ermöglichen es Ihnen, Werte zu String-Schlüsseln anstelle von numerischen Indizes zuzuordnen.

declare -A capitals=(
 [Frankreich]="Paris"
 [Italien]="Rom"
 [Japan]="Tokio"
)
echo "${capitals[Frankreich]}"

Sie können sie einfach durchlaufen:

for country in "${!capitals[@]}"; do
 echo "$country → ${capitals[$country]}"
done

Beachten Sie, dass die Reihenfolge der Schlüssel in assoziativen Arrays nicht definiert ist. Wenn die Reihenfolge wichtig ist, müssen Sie sie manuell sortieren. Assoziative Arrays sind nützlich, wenn Sie Beziehungen abbilden oder mit JSON-Daten arbeiten müssen.

Spärliche Arrays

Spärliche Arrays sind ein weniger bekanntes, aber interessantes Merkmal. Sie sind indizierte Arrays mit Lücken in ihrer Nummerierung. Sie können Elemente beliebigen Indizes zuweisen. Bash verlangt nicht, dass sie sequenziell sind.

numbers=()
numbers[2]=200
numbers[10]=1000
numbers[42]=4200

echo "${!numbers[@]}"

Der Zugriff auf nicht gesetzte Indizes gibt nichts zurück:

echo "${numbers[5]}"

Sie können dennoch bestehende Elemente sicher durchlaufen. Wenn Sie einen großen Datensatz haben, bei dem nicht jeder Index verwendet wird, oder mit Ergebnissen arbeiten, die natürlicherweise "Löcher" aufweisen, kann die spärliche Funktion oft nützlich sein.

Zugriff, Modifizierung und Löschen von Array-Elementen

Sobald Sie ein Array deklariert und befüllt haben, besteht der nächste Schritt darin, zu lernen, wie Sie Werte abfragen, aktualisieren und bei Bedarf entfernen. Die Arbeit mit Array-Elementen in Bash ist unkompliziert, aber es gibt einige subtile Verhaltensweisen, die es wert sind, sich zu merken.

Sie können auf ein Element durch seinen Index (bei indizierten Arrays) oder Schlüssel (bei assoziativen Arrays) zugreifen. Für indizierte Arrays:

fruits=("apple" "banana" "cherry")

echo "${fruits[0]}"
echo "${fruits[2]}"

Für assoziative Arrays:

declare -A capitals=(
 [Frankreich]="Paris"
 [Italien]="Rom"
 [Japan]="Tokio"
)

echo "${capitals[Japan]}"

In beiden Fällen, wenn der Index oder Schlüssel keinen Wert hat, erhalten Sie eine leere Zeichenkette als Ausgabe. Wenn Sie alle Elemente oder Indizes auf einmal abrufen möchten, gibt es einige spezielle Syntaxen. Hier ist ein CheatSheet, dem Sie folgen können.

Erweiterungssyntax Beschreibung
${array[@]} Alle Werte
${!array[@]} Alle Indizes oder Schlüssel
${#array[@]} Anzahl der Elemente
${array[*]} Alle Werte (in einer Zeichenkette zusammengeführt)

Quote Ihre Erweiterungen immer: "${array[@]}". Unquoted-Erweiterungen können fehlschlagen, wenn Elemente Leerzeichen oder Wildcards enthalten.

Um ein Array-Element zu modifizieren, weisen Sie es einfach neu zu:

fruits[1]="blackberry"
echo "${fruits[1]}"
fruits[1]="blueberry"
echo "${fruits[1]}"

Sie können auch neue Elemente hinzufügen:

fruits+=("dragonfruit")

Für assoziative Arrays weisen Sie Werte Schlüssel neu zu.

capitals["Frankreich"]="Paris"
echo "${capitals[Frankreich]}"
capitals["Frankreich"]="Marseille"
echo "${capitals[Frankreich]}"

Das Neuzuweisen eines Wertes überschreibt den alten, seien Sie also vorsichtig, wenn Sie dies tun.

Um ein Element zu löschen, können Sie den unset-Befehl verwenden. Er kann spezifische Elemente oder das gesamte Array entfernen.

unset 'fruits[1]'
echo.
${fruits[@]}"

Um mehrere Elemente zu entfernen:

unset 'fruits[0]' 'fruits[2]'

Um das gesamte Array zu löschen, geben Sie einfach den Array-Namen an:

unset fruits

Dasselbe gilt für assoziative Arrays. Verwenden Sie den Befehl unset und den Schlüssel (anstatt des Indexes), um dieses Element zu entfernen.

unset 'capitals[Frankreich]'

Wenn Sie mehrere Werte ändern oder entfernen möchten, ist es eine gute Idee, eine for-Schleife zu verwenden, um durch das Array zu iterieren.

Einige erweiterte Array-Tricks

Jetzt wissen Sie, wie man Arrays deklariert, durchläuft und manipuliert. Bash kann jedoch viel mehr damit tun. Lassen Sie uns einige erweiterte Techniken für Arrays anschauen, die Ihre Skripte intelligenter und einfacher wartbar machen.

Slicing

Sie können Teilmengen von Arrays mit der Slice-Syntax extrahieren.

${array[@]:start:length}

Hier bezieht sich start auf das erste Element im Slice, während length angibt, wie viele Elemente Sie in der Teilmenge behalten möchten. Beachten Sie, dass Bash-Arrays 0-basierte Indices haben. Beispiel:

numbers=(10 20 30 40 50)
echo "${numbers[@]:1:3}"

Wir haben die mittleren drei Elemente, da wir ab Index eins gesliced haben. Dies ist nützlich, wenn Sie einen Teil der Ergebnisse eines Befehls verarbeiten möchten.

Kopieren und Kombinieren

Das Kopieren eines Arrays erfordert einfach, dass Sie die Array-Elemente einem anderen neuen Array zuweisen.

copy=("${fruits[@]}")

Bash kopiert Arrays nach Wert, nicht nach Referenz. Das bedeutet, dass Änderungen an 'copy' das Original nicht beeinflussen.

Um zwei oder mehr Arrays zu einem zu kombinieren, übergeben Sie ihre Elemente an ein neues Array mit der Expansion-Syntax.

numbers=(1 2 3)
more_numbers=(4 5 6)
combined=("${numbers[@]}" "${more_numbers[@]}")

echo "${combined[@]}"

Sortieren

Ein Array zu sortieren bedeutet, es in einer bestimmten Reihenfolge anzuordnen. Dies kann numerisch oder alphabetisch (je nach Elementtyp) aufsteigend oder absteigend sein. Bash hat keine eingebaute Sortierfunktion, aber es ist einfach, dies mit der Befehlsersetzung und dem sort-Befehl zu erreichen.

fruits=("Banane" "Apfel" "Kirsche" "Dattel")

IFS=$'\n' sorted=($(sort unset IFS

echo "${sorted[@]}"

Hier sortiert der Befehl sort die Elemente alphabetisch. IFS=$'\n' stellt sicher, dass Elemente mit Leerzeichen nicht falsch aufgeteilt werden. Wir speichern die sortierte Ausgabe in einem neuen Array.

Ähnlich können wir auch eine umgekehrte Sortierung durchführen.

IFS=$'\n' sorted=($(sort -r unset IFS

Im Falle von numerischen Daten können Sie sort -n verwenden.

numbers=(42 5 19 100 3)
IFS=$'\n' sorted_nums=($(sort -n unset IFS
echo "${sorted_nums[@]}"

Duplikate Entfernen

Ein klassisches Problem. Entfernen Sie alle doppelten Elemente im Array, sodass alle verbleibenden Elemente eindeutig sind. Wir können wieder auf den sort-Befehl zurückgreifen.

numbers=(1 2 2 3 4 3 5)

unique=($(printf "%s\n" "${numbers[@]}" | sort -u))
echo "${unique[@]}"

Dieser Ansatz funktioniert, indem er alle Elemente ausgibt, sie sortiert und Duplikate mit -u entfernt. Diese Methode ist jedoch von der Reihenfolge abhängig. Sie sortiert Ihr Array dabei. Wenn Sie die ursprüngliche Reihenfolge beibehalten möchten, müssen Sie manuell durchlaufen und bereits gesehene Elemente verfolgen.

Arrays Filtern

Der letzte Trick, den ich behandeln möchte, ist das Filtern von Elementen aus einem Array. Wir tun dies mit Mustererkennung und Parameterexpansion.

files=("data.txt" "image.png" "notes.txt" "script.sh")

txt_files=()
for f in "${files[@]}"; do
 [[ $f == *.txt ]] && txt_files+=("$f")
done

echo "${txt_files[@]}"

Dieser Trick ist einfach, aber mächtig, wenn es um gemischte Dateilisten oder Datensätze geht.

Damit sollten Sie ein gutes Verständnis dafür haben, wie man Arrays in Bash verwendet, um Ihre Daten zu manipulieren. Das wird Ihnen helfen, bessere Skripte zu schreiben. Sie können damit beginnen, einige Beispiel-Bash-Skripte durchzugehen.

Bist du neugierig auf weitere Artikel wie Wie man mit Arrays in Bash-Skripten arbeitet? Entdecke spannende Inhalte in der Kategorie Linux.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Go up