Bash Arrays

Arrays stellen eine der grundlegendsten und am häufigsten verwendeten Datenstrukturen dar. Ein Array ist eine Variable, die mehrere Variablen speichern kann.

In diesem Tutorial geht es um Bash Arrays und wie man sie in Bash-Skripten nutzen kann.

Bash Arrays

Bash unterstützt eindimensionale Arrays, die numerisch oder assoziativ indiziert sein können. Numerische Arrays werden durch Ganzzahlen indiziert, assoziative Arrays durch Zeichenketten.

Die Indizierung numerischer Arrays kann auch mit negativen Indizes vom Ende aus erfolgen, wobei der Index -1 auf das letzte Element verweist. Die Indizes müssen nicht aufeinanderfolgend sein.

Im Gegensatz zu den meisten Programmiersprachen müssen die Elemente in Bash-Arrays nicht vom gleichen Datentyp sein. Ein Array kann beispielsweise sowohl Strings als auch Zahlen enthalten.

Bash unterstützt keine mehrdimensionalen Arrays und man kann somit auch keine Array-Elemente haben, die wiederum Arrays sind.

Es gibt keine Begrenzung für die maximale Anzahl von Elementen, die in einem Array gespeichert werden können.

Erstellen von Bash-Arrays

Es gibt verschiedene Möglichkeiten, Arrays in Bash zu initialisieren.

Erstellen von numerisch indizierten Arrays

Bash-Variablen sind untypisiert, sodass jede Variable als indiziertes Array verwendet werden kann, ohne sie zuvor deklarieren zu müssen.

Um ein Array explizit zu deklarieren, verwendet man das eingebaute Befehl declare:

declare -a array_name

Man kann ein indiziertes Array auf folgende Art und Weise erstellen:

array_name[index_1]=wert_1
array_name[index_2]=wert_2
array_name[index_n]=wert_n

Dabei ist index_* eine positive ganze Zahl.

Eine weitere Möglichkeit, numerische Arrays zu erstellen, besteht darin, die Elemente in einer Klammerliste mit Leerzeichen zu trennen:

array_name=( element_1 element_2 element_n )

Wenn das Array mit der obigen Form erstellt wird, beginnt die Indizierung bei Null, d.h. das erste Element hat den Index 0.

Erstellen von assoziativen Arrays

Anders als numerisch indizierte Arrays müssen assoziative Arrays deklariert werden, bevor sie verwendet werden können.

Um ein assoziatives Array zu deklarieren, verwendet man den Befehl declare mit der Option -A:

declare -A array_name

Assoziative Arrays können auf folgende Art und Weise erstellt werden:

declare -A array_name

array_name[index_foo]=wert_foo
array_name[index_bar]=wert_bar
array_name[index_lol]=wert_lol

Dabei kann index_* eine beliebige Zeichenkette sein.

Man kann auch ein assoziatives Array mit folgender Syntax erstellen:

declare -A array_name

array_name=(
  [index_foo]=wert_foo
  [index_bar]=wert_bar
  [index_lol]=wert_lol
)

Array-Operationen

Die Array-Syntax in Bash kann auf den ersten Blick etwas ungewöhnlich erscheinen, aber nachdem du diesen Artikel gelesen hast, wird du das Prinzip verstanden haben.

Referenzierung von Array-Elementen

Um auf ein einzelnes Element zuzugreifen, muss man den Index des Elements kennen.

Man kann jedes Element mit der folgenden Syntax referenzieren:

${array_name[index]}

Die Syntax zum Zugriff auf ein Array-Element ähnelt der Syntax in den meisten Programmiersprachen. Die geschweiften Klammern ${} sind erforderlich, um Shell-Dateierweiterungsoperatoren zu vermeiden.

Um das Element mit dem Index 1 auszugeben, kann man folgendes tun:

## Array deklarieren
declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Element ausgeben
echo ${my_array[1]}
Jupiter

Wenn man @ oder * als Index verwendet, wird das Wort auf alle Mitglieder des Arrays erweitert. Um alle Elemente auszugeben, kann man folgendes tun:

## Array deklarieren
declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Alle Elemente ausgeben
echo "${my_array[@]}"

Der einzige Unterschied zwischen @ und * besteht darin, dass bei Verwendung von * das Ergebnis als einzelnes Wort zurückgegeben wird, wobei die Array-Elemente durch Leerzeichen getrennt sind. Bei Verwendung von @ werden alle Array-Elemente als separate Wörter zurückgegeben. Dies ist besonders wichtig, wenn man das Array mit einer Schleife durchlaufen möchte.

Um die Schlüssel bzw. Indizes des Arrays auszugeben, fügt man das !-Operator vor dem Array-Namen hinzu:

${!array_name[index]}

Hier ist ein Beispiel:

## Array deklarieren
declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Schlüssel ausgeben
echo "${!my_array[@]}"
0 1 2 3

Array-Länge

Um die Länge eines Arrays zu ermitteln, verwendet man die folgende Syntax:

${#array_name[@]}

Die Syntax ist die gleiche wie beim Zugriff auf alle Elemente, mit dem Zusatz des Zeichens # vor dem Array-Namen.

## Array deklarieren
declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Array-Länge
echo ${#my_array[@]}
4

Schleife durch das Array

Die häufigste Methode, um über jedes Element in einem Array zu iterieren, ist die for-Schleife:

declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Array-Schleife
for i in "${my_array[@]}"
do 
  echo "$i"
done

Der obige Code durchläuft das Array und gibt jedes Element in einer neuen Zeile aus:

Saturn
Jupiter
Uranus
Neptun

Das folgende Beispiel zeigt, wie Du alle Schlüssel und Werte eines Bash-Arrays ausgeben kannst:

declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Array-Schleife
for i in "${!my_array[@]}"
do
  echo "$i" "${my_array[$i]}"
done
0 Saturn
1 Jupiter
2 Uranus
3 Neptun

Eine alternative Möglichkeit, um ein Array in einer Schleife zu durchlaufen, besteht darin, die Länge des Arrays zu ermitteln und die Schleife im C-Stil zu verwenden:

declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

# Länge des Arrays
length=${#my_array[@]}

# Array-Schleife
for (( i=0; i ${length}; i++ ))
do
  echo $i ${my_array[$i]}
done
0 Saturn
1 Jupiter
2 Uranus
3 Neptun

Hinzufügen eines neuen Elements

Um ein neues Element zu einem Bash-Array hinzuzufügen und ihm einen Index zuzuweisen, verwende die folgende Syntax:

my_array[index_n]="Neues Element"

Hier ist ein Beispiel:

declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Neues Element hinzufügen
my_array[9]="Pluto"

## Alle Elemente ausgeben
echo "${my_array[@]}"
Saturn Jupiter Uranus Neptun Pluto

Eine weitere Möglichkeit, ein neues Element hinzuzufügen, ohne einen Index anzugeben, besteht darin, den +=-Operator zu verwenden. Du kannst ein oder mehrere Elemente hinzufügen:

declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Neue Elemente hinzufügen
my_array+=(Erde Mars)

## Alle Elemente ausgeben
echo "${my_array[@]}"
Saturn Jupiter Uranus Neptun Erde Mars

Löschen eines Elements

Um ein einzelnes Element aus einem Array zu löschen, musst Du den Index bzw. Schlüssel des Elements kennen. Du kannst das Element mit dem unset-Befehl entfernen:

unset my_Array[index]

Hier ist ein Beispiel:

declare -a my_array=( "Saturn" "Jupiter" "Uranus" "Neptun" )

## Element entfernen
unset my_array[2]

## Alle Elemente ausgeben
echo "${my_array[@]}"
Saturn Jupiter Neptun

Zusammenfassung

In diesem Tutorial haben wir gemeinsam gelernt, wie Du numerisch indizierte und assoziative Arrays in Bash erstellst. Wir haben Dir gezeigt, wie Du durch die Arrays iterierst, die Array-Länge berechnest und Elemente hinzufügst oder entfernst.

Wir hoffen, dass Du durch dieses Tutorial ein besseres Verständnis für Arrays in Bash erlangt hast. Wenn Du Fragen oder Feedback hast, hinterlasse bitte einen Kommentar.

Weiterführende Informationen

Weiterführende Informationen zu Bash Arrays findest du in Bash Reference.

War dieser Beitrag hilfreich?

Verwandte Beiträge