Wie man mit Arrays in Bash-Skripten arbeitet

Indeks
  1. Deklarieren eines Arrays
  2. Durchlaufen eines Arrays
  3. Verschiedene Arten von Arrays in Bash
    1. Indizierte Arrays
    2. Assoziative Arrays
    3. Spärliche Arrays
  4. Zugriff, Änderung und Löschung 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 optimieren die Datenverwaltung in Skripten, erleichtern den Umgang mit großen Datenmengen und reduzieren die Komplexität durch weniger erforderliche Variablen.

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

Deklarieren eines Arrays

Arrays in Bash ermöglichen es Ihnen, mehrere Datenstücke in einer einzigen Variablen zu speichern, ähnlich wie in einer Python-Liste. Dies macht sie zu leistungsstarken Werkzeugen zur Verwaltung von Datensätzen verwandter Werte wie Dateinamen, Benutzernamen, Konfigurationsoptionen oder Befehlszeilenargumenten.

Im Gegensatz zu vielen anderen Programmiersprachen verlangt Bash nicht, dass Sie einen Arraytyp explizit deklarieren. Sie weisen einfach Werte mit einer bestimmten Syntax zu, und Bash weiß, dass es sich um ein Array handelt. Die Methode zur Deklaration variiert je nach Arraytyp (später behandelt).

Um ein indiziertes Array, das am häufigsten verwendete Array, zu deklarieren, 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 Befehl echo anzeigen, so:

echo $arr

Da keine Elemente vorhanden sind, sehen Sie nichts außer einer leeren Zeile. Sie können Werte in derselben Zeile dem Array zuweisen. Geben Sie dazu durch Leerzeichen getrennte Elemente innerhalb der Klammern ein.

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

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

echo "${fruits[@]}"

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 nützlich, wenn Sie das Array dynamisch befüllen müssen. Sie können auch einzelne 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 Built-in zu verwenden, um ein indiziertes Array explizit zu definieren.

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

Dies macht für andere klar, dass 'colors' als Array gedacht ist, was in größeren Skripten hilfreich sein kann. Um zu bestätigen, ob eine Bash-Variable ein Array ist (und welchen Typ), verwenden Sie den Befehl declare -p. Dies ist besonders nützlich beim Debuggen von Skripten.

Durchlaufen eines Arrays

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

Die häufigste Möglichkeit, durch jedes Element eines Arrays zu iterieren, ist eine einfache Bash-for-Schleife.

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

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

Das ist großartig, um die Werte durchzugehen. 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 nützlich, wenn das Array nicht sequentiell ist (zum Beispiel, wenn einige Elemente entfernt wurden). Wenn Ihr Array aus der Ausgabe eines Befehls stammt, kann eine while read Schleife effizienter oder übersichtlicher sein.

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

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

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

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

Beim Durchlaufen mehrerer Arrays stellen Sie sicher, dass sie die gleiche Länge haben.

Verschiedene Arten von Arrays in Bash

Bash-Arrays kommen in einigen 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.
  2. Indizierte Arrays: Listen, die nach Zahlen indiziert sind.
  3. Assoziative Arrays: Schlüssel-Wert-Paare, die nach Zeichenfolgen indiziert sind.

Es gibt auch eine besondere Art, die erwähnenswert ist, nämlich spärliche Arrays, bei denen die numerischen Indizes nicht aufeinanderfolgend sind. Lassen Sie uns durch jede Art gehen.

Indizierte Arrays

Indizierte Arrays sind die gebräuchlichste Art und ideal, wenn Sie geordnete Listen wie Dateinamen, Benutzer-IDs oder Zahlen speichern möchten. Jedes Element wird durch einen Ganzzahlenindex 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 einer natürlichen Reihenfolge haben oder die 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 Schlüsselstrings anstelle von numerischen Indizes zuzuweisen.

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

Sie können einfach durch sie iterieren:

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 JSON-Datensatzformate verarbeiten müssen.

Spärliche Arrays

Spärliche Arrays sind eine weniger bekannte, aber interessante Funktion. Sie sind indizierte Arrays mit Lücken in ihrer Nummerierung. Sie können Elemente beliebigen Indizes zuweisen. Bash verlangt nicht, dass sie aufeinanderfolgend 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 sicher durch vorhandene Elemente iterieren. Wenn Sie einen großen Datensatz haben, bei dem nicht jeder Index verwendet wird, oder mit Ergebnissen arbeiten, die von Natur aus „Löcher“ haben, kann die spärliche Funktion oft nützlich sein.

Zugriff, Änderung und Löschung von Array-Elementen

Sobald Sie ein Array deklariert und befüllt haben, besteht der nächste Schritt darin, zu lernen, wie Sie Werte herausbekommen, sie aktualisieren und bei Bedarf entfernen können. Die Arbeit mit Array-Elementen in Bash ist unkompliziert, aber es gibt ein paar subtile Verhaltensweisen, die es wert sind, beachtet zu werden.

Sie können auf ein Element über dessen 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 Zeichenfolge als Ausgabe. Wenn Sie alle Elemente oder Indizes auf einmal abrufen möchten, gibt es einige spezielle Syntaxen. Hier ist ein Spickzettel, dem Sie folgen können.

Erweiterungs-SyntaxBeschreibung
${array[@]}Alle Werte
${!array[@]}Alle Indizes oder Schlüssel
${#array[@]}Anzahl der Elemente
${array[*]}Alle Werte (in eine Zeichenfolge zusammengeführt)

Quoten Sie immer Ihre Erweiterungen: "${array[@]}". Unquotierte Erweiterungen können fehlerhaft sein, wenn Elemente Leerzeichen oder Platzhalter enthalten.

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

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

Sie können auch neue Elemente anfügen:

fruits+=("dragonfruit")

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

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

Eine Neuzuweisung eines Wertes überschreibt den alten, daher sollten Sie beim Durchführen vorsichtig sein.

Um ein Element zu löschen, können Sie den unset-Befehl verwenden. Damit können spezifische Elemente oder das gesamte Array entfernt werden.

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

Das Gleiche gilt für assoziative Arrays. Verwenden Sie den Befehl unset und den Schlüssel (anstatt des Index), 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 noch viel mehr mit ihnen machen. Lassen Sie uns einige erweiterte Array-Techniken betrachten, die Ihre Skripte intelligenter und einfacher zu warten machen können.

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 eine 0-basierte Indizierung haben. Beispiel:

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

Wir haben die mittleren drei Elemente, da wir ab Index eins geschnitten 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 neuen Array zuweisen.

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

Bash kopiert Arrays nach Wert, nicht nach Referenz. Das Ändern von 'copy' wirkt sich daher nicht auf das Original aus.

Um zwei oder mehr Arrays in einem zu kombinieren, übergeben Sie deren Elemente an ein neues Array mit der Erweiterungssyntax.

zahlen=(1 2 3)
mehr_zahlen=(4 5 6)
kombiniert=("${zahlen[@]}" "${mehr_zahlen[@]}")

echo "${kombiniert[@]}"

Sortieren

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

früchte=("banane" "apfel" "kirsche" "dattel")

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

echo "${sortiert[@]}"

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

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

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

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

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

Duplikate entfernen

Ein klassisches Problem. Entfernen Sie alle doppelten Elemente im Array, damit alle verbleibenden Elemente einzigartig sind. Wir können erneut die Hilfe des sort-Befehls in Anspruch nehmen.

zahlen=(1 2 2 3 4 3 5)

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

Dieser Ansatz funktioniert, indem alle Elemente ausgegeben, sortiert und Duplikate mit -u entfernt werden. Dieses Verfahren ist jedoch reihenfolgebestimmt. Es sortiert Ihr Array im Prozess. Wenn Sie die ursprüngliche Reihenfolge beibehalten möchten, müssen Sie manuell durchlaufen und die gesehenen Elemente verfolgen.

Arrays filtern

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

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

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

echo "${txt_dateien[@]}"

Dieser Trick ist einfach, aber mächtig, wenn es darum geht, mit gemischten Dateilisten oder Datensätzen umzugehen.

Damit sollten Sie ein gutes Verständnis dafür haben, wie Sie Arrays in Bash verwenden, um Ihre Daten zu manipulieren. Dies wird Ihnen helfen, bessere Skripte zu schreiben. Sie können mit dem Durchgehen einiger Beispiel-Bash-Skripte beginnen.

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

Schreibe einen Kommentar

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

Go up