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)

4,0
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]}"
4.3

Letztes Element mit der Erweiterungssyntax der Teilzeichenfolge drucken

echo "${arr[@]: -1 }"
4.3

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
3.1

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

4,0

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
2,04

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
2,04

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
2,04

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
4,0

Verwenden von mapfile oder readarray (die auch synonym sind):

mapfile -t arr < file
readarray -t arr < file


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow