Zum Inhalt

Bash: Arrays

Anlegen eines Arrays

Anlegen eines leeren Arrays

declare -a array

Anlegen eines vorbelegten Arrays

declare -a arrayPre=(wert1 wert2 wert3 wert4)

Werte an ein Array anhängen

array+=("wert1")
array+=("wert2")
array+=("wert3")
array+=("wert4")

Zugriff auf ein Element mit Index

Das erste Element in einem Bash Array hat den Index 0.

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

Einer Wert mit Index setzen

array[1]="wert2_neu"
echo "${array[1]}"

array[5]="wert5"
echo "${array[5]}"
Was ist der Wert vom Element mit dem nicht belegtem Index 4 ?

echo "${array[4]}"
Da dem Array mit dem Index 4 noch kein Wert zugewiesen wurde, wird der Ausdruck ${array[4]} zu einem Leerstring expandiert

Länge eines Arrays

echo "Länge des Arrays array    : ${#array[@]}"
echo "Länge des Arrays arrayPre : ${#arrayPre[@]}"

Array kopieren

array2=("${array[@]}")

Array konkatenieren

array3=("${array[@]}" "${array2[@]}")

Teilbereich (von/bis) eines Arrays ausgeben

echo "${array[@]:1:4}"
Es werden die Werte mit dem Index 1-3 ausgegeben. Der erste Wert (1) gibt an, ab welchem Index die Ausgabe bebinnt und der zweite Wert (4) gibt den ersten Index an, dessen Wert nicht mehr ausgegeben werden soll.

Ausgabe des gesamten Arrays

echo "${array[@]}"

Werte bei der Ausgabe ersetzen

echo "${array[@]/wert/value}"
Dieser Ausdruck gibt alle Werte des Array aus. Dabei wird der String "wert" durch den String "value" ersetzt.

Iteration über ein Array

for wert in "${array[@]}"
do
    echo "Wert : ${wert}"
done

Prüfen, ob ein Wert im Array enthalten ist

if [[ " ${array[@]} " =~ " wert1 " ]]
then
    echo "der Wert wert1 ist im Array array enthalten"
fi

Prüfen, ob ein Wert nicht im Array enthalten ist

if [[ ! " ${array[@]} " =~ " wertNONE " ]]
then
    echo "der Wert wertNone ist im Array array NICHT enthalten"
fi

Löschen eines Elementes aus einem Array

unset array[5]

Löschen eines Arrays

unset array

Zeilenweises Einlesen einer Datei in ein Array

Diesen Code habe ich in der BashFAQ/005 im Kapitel "2.1. Loading lines from a file or stream" gefunden.

mapfile -t array < ./tmp.txt
echo "Anzahl gelesener Zeilen: \${#array[@]}: ${#array[@]}"
for line in "${array[@]}"
do
    echo ">>>>> ${line}"
done

Ein Skript, dass alle hier beschriebene Operationen ausführt, findet man hier: bash_arrays.bash


Letztes Update: 2022-01-28