Suche…
Array-Zuweisungen
Listenzuordnung
Wenn Sie mit Perl, C oder Java vertraut sind, könnten Sie denken, dass Bash Array-Elemente mit Kommas trennt. Stattdessen verwendet Bash Leerzeichen:
# Array in Perl
my @array = (1, 2, 3, 4);
# Array in Bash
array=(1 2 3 4)
Erstellen Sie ein Array mit neuen Elementen:
array=('first element' 'second element' 'third element')
Indexzuordnung
Erstellen Sie ein Array mit expliziten Elementindizes:
array=([3]='fourth element' [4]='fifth element')
Zuordnung nach Index
array[0]='first element'
array[1]='second element'
Zuordnung nach Namen (assoziatives Array)
declare -A array
array[first]='First element'
array[second]='Second element'
Dynamische Zuordnung
Erstellen Sie ein Array aus der Ausgabe eines anderen Befehls. Verwenden Sie beispielsweise seq , um einen Bereich von 1 bis 10 zu erhalten:
array=(`seq 1 10`)
Zuordnung aus den Eingabeargumenten des Skripts:
array=("$@")
Zuordnung innerhalb von Schleifen:
while read -r; do
#array+=("$REPLY") # Array append
array[$i]="$REPLY" # Assignment by index
let i++ # Increment index
done < <(seq 1 10) # command substitution
echo ${array[@]} # output: 1 2 3 4 5 6 7 8 9 10
Dabei ist $REPLY
immer die aktuelle Eingabe
Zugriff auf Array-Elemente
Element mit Index 0 drucken
echo "${array[0]}"
Letztes Element mit der Erweiterungssyntax der Teilzeichenfolge drucken
echo "${arr[@]: -1 }"
Letztes Element mit der Indexsyntax drucken
echo "${array[-1]}"
Alle Elemente werden einzeln in Anführungszeichen gesetzt
echo "${array[@]}"
Alle Elemente als einzelne Zeichenfolge in Anführungszeichen drucken
echo "${array[*]}"
Drucken Sie alle Elemente aus Index 1, die jeweils separat angegeben sind
echo "${array[@]:1}"
Drucken Sie 3 Elemente aus Index 1, die jeweils separat zitiert werden
echo "${array[@]:1:3}"
String-Operationen
Wenn auf ein einzelnes Element verwiesen wird, sind Stringoperationen zulässig:
array=(zero one two)
echo "${array[0]:0:3}" # gives out zer (chars at position 0, 1 and 2 in the string zero)
echo "${array[0]:1:3}" # gives out ero (chars at position 1, 2 and 3 in the string zero)
${array[$i]:N:M}
gibt also eine Zeichenkette von der N
ten Position (beginnend mit 0) in der Zeichenfolge ${array[$i]}
wobei M
folgende Zeichen sind.
Array-Länge
${#array[@]}
gibt die Länge des Arrays an ${array[@]}
:
array=('first element' 'second element' 'third element')
echo "${#array[@]}" # gives out a length of 3
Dies funktioniert auch mit Strings in einzelnen Elementen:
echo "${#array[0]}" # gives out the lenght of the string at element 0: 13
Array-Änderung
Index ändern
Initialisieren oder aktualisieren Sie ein bestimmtes Element im Array
array[10]="elevenths element" # because it's starting with 0
Anhängen
Ändern Sie das Array und fügen Sie am Ende Elemente hinzu, wenn kein Index angegeben ist.
array+=('fourth element' 'fifth element')
Ersetzen Sie das gesamte Array durch eine neue Parameterliste.
array=("${array[@]}" "fourth element" "fifth element")
Füge ein Element am Anfang hinzu:
array=("new element" "${array[@]}")
Einfügen
Fügen Sie ein Element an einem bestimmten Index ein:
arr=(a b c d)
# insert an element at index 2
i=2
arr=("${arr[@]:0:$i}" 'new' "${arr[@]:$i}")
echo "${arr[2]}" #output: new
Löschen
Löschen Array - Indizes die Verwendung unset
builtin:
arr=(a b c)
echo "${arr[@]}" # outputs: a b c
echo "${!arr[@]}" # outputs: 0 1 2
unset -v 'arr[1]'
echo "${arr[@]}" # outputs: a c
echo "${!arr[@]}" # outputs: 0 2
Verschmelzen
array3=("${array1[@]}" "${array2[@]}")
Dies funktioniert auch für spärliche Arrays.
Indizierung eines Arrays neu
Dies kann nützlich sein, wenn Elemente aus einem Array entfernt wurden oder wenn Sie sich nicht sicher sind, ob das Array Lücken enthält. So erstellen Sie die Indizes ohne Lücken:
array=("${array[@]}")
Array-Iteration
Die Array-Iteration gibt es in zwei Varianten: foreach und classic for-loop:
a=(1 2 3 4)
# foreach loop
for y in "${a[@]}"; do
# act on $y
echo "$y"
done
# classic for-loop
for ((idx=0; idx < ${#a[@]}; ++idx)); do
# act on ${a[$idx]}
echo "${a[$idx]}"
done
Sie können auch die Ausgabe eines Befehls durchlaufen:
a=($(tr ',' ' ' <<<"a,b,c,d")) # tr can transform one character to another
for y in "${a[@]}"; do
echo "$y"
done
Zerstören, Löschen oder Löschen eines Arrays
So zerstören, löschen oder löschen Sie ein Array:
unset array
So zerstören, löschen oder löschen Sie ein einzelnes Arrayelement:
unset array[10]
Assoziative Arrays
Deklarieren Sie ein assoziatives Array
declare -A aa
Das Deklarieren eines assoziativen Arrays vor der Initialisierung oder Verwendung ist obligatorisch.
Elemente initialisieren
Sie können Elemente nacheinander wie folgt initialisieren:
aa[hello]=world
aa[ab]=cd
aa["key with space"]="hello world"
Sie können auch ein gesamtes assoziatives Array in einer einzigen Anweisung initialisieren:
aa=([hello]=world [ab]=cd ["key with space"]="hello world")
Greifen Sie auf ein assoziatives Arrayelement zu
echo ${aa[hello]}
# Out: world
Auflisten von assoziativen Array-Schlüsseln
echo "${!aa[@]}"
#Out: hello ab key with space
Auflisten assoziativer Arraywerte
echo "${aa[@]}"
#Out: world cd hello world
Durchlaufen Sie assoziative Array-Schlüssel und -Werte
for key in "${!aa[@]}"; do
echo "Key: ${key}"
echo "Value: ${array[$key]}"
done
# Out:
# Key: hello
# Value: world
# Key: ab
# Value: cd
# Key: key with space
# Value: hello world
Zählen Sie assoziative Array-Elemente
echo "${#aa[@]}"
# Out: 3
Liste der initialisierten Indizes
Rufen Sie die Liste der initialisierten Indizes in einem Array ab
$ arr[2]='second'
$ arr[10]='tenth'
$ arr[25]='twenty five'
$ echo ${!arr[@]}
2 10 25
Durchlaufen eines Arrays
Unser Beispielarray:
arr=(a b c d e f)
Verwenden einer for..in
Schleife:
for i in "${arr[@]}"; do
echo "$i"
done
C-Stil for
Schleife verwenden:
for ((i=0;i<${#arr[@]};i++)); do
echo "${arr[$i]}"
done
while
Schleife verwenden:
i=0
while [ $i -lt ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
while
Schleife mit numerischen Bedingungen verwenden:
i=0
while (( $i < ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
Verwenden einer until
Schleife:
i=0
until [ $i -ge ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
Verwenden einer until
Schleife mit numerischer Bedingung:
i=0
until (( $i >= ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
Array von String
stringVar="Apple Orange Banana Mango"
arrayVar=(${stringVar// / })
Jedes Leerzeichen in der Zeichenfolge kennzeichnet ein neues Element im resultierenden Array.
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[3]} # will print Mango
Ebenso können andere Zeichen für das Trennzeichen verwendet werden.
stringVar="Apple+Orange+Banana+Mango"
arrayVar=(${stringVar//+/ })
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[2]} # will print Banana
Array-Insert-Funktion
Diese Funktion fügt ein Element an einem bestimmten Index in ein Array ein:
insert(){
h='
################## insert ########################
# Usage:
# insert arr_name index element
#
# Parameters:
# arr_name : Name of the array variable
# index : Index to insert at
# element : Element to insert
##################################################
'
[[ $1 = -h ]] && { echo "$h" >/dev/stderr; return 1; }
declare -n __arr__=$1 # reference to the array variable
i=$2 # index to insert at
el="$3" # element to insert
# handle errors
[[ ! "$i" =~ ^[0-9]+$ ]] && { echo "E: insert: index must be a valid integer" >/dev/stderr; return 1; }
(( $1 < 0 )) && { echo "E: insert: index can not be negative" >/dev/stderr; return 1; }
# Now insert $el at $i
__arr__=("${__arr__[@]:0:$i}" "$el" "${__arr__[@]:$i}")
}
Verwendungszweck:
insert array_variable_name index element
Beispiel:
arr=(a b c d)
echo "${arr[2]}" # output: c
# Now call the insert function and pass the array variable name,
# index to insert at
# and the element to insert
insert arr 2 'New Element'
# 'New Element' was inserted at index 2 in arr, now print them
echo "${arr[2]}" # output: New Element
echo "${arr[3]}" # output: c
Eine ganze Datei in ein Array einlesen
Lesen in einem einzigen Schritt:
IFS=$'\n' read -r -a arr < file
In einer Schleife lesen:
arr=()
while IFS= read -r line; do
arr+=("$line")
done
Verwenden von mapfile
oder readarray
(die auch synonym sind):
mapfile -t arr < file
readarray -t arr < file