Wie füge ich in bash ein Element zum Array hinzu / entferne es?


Antworten:


48

Um ein Element am Anfang eines Arrays einzufügen, verwenden Sie.

arr=("new_element" "${arr[@]}")

Im Allgemeinen würden Sie tun.

arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")

Um ein Element am Ende eines Arrays einzufügen, verwenden Sie.

arr=( "${arr[@]}" "new_element" )

Oder stattdessen

arr+=( "new_element" )

Im Allgemeinen würden Sie tun.

arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )

Um einem bestimmten Index eines Arrays ein Element hinzuzufügen, verwenden Sie.

Nehmen wir an, wir möchten der Position von Index2 arr [2] ein Element hinzufügen , das wir tatsächlich in den folgenden Unterarrays zusammenführen:

  1. Holen Sie sich alle Elemente vor Index position2 arr [0] und arr [1] ;
  2. Fügen Sie dem Array ein Element hinzu.
  3. Holen Sie sich alle Elemente mit Index position2 zum letzten arr [2] , arr [3] , ....

    arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )

Ein Element aus dem Array entfernen

Zusätzlich zum Entfernen eines Elements aus einem Array (z. B. Element Nr. 2) müssen zwei Unterarrays verkettet werden. Das erste Unterarray enthält die Elemente vor Element 2 und das zweite Unterarray enthält die Elemente nach Element 2.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}erhält zwei Elemente arr [0] und arr [1] beginnt am Anfang des Arrays.
  • ${arr[@]:3}Liefert alle Elemente von index3 arr [3] bis zum letzten.

Eine andere Möglichkeit, ein Element zu entfernen, ist

  1. Using unset(ordne dem Element tatsächlich den Wert 'null' zu)

    unset arr[2]
  2. Verwenden Sie das Ersetzungsmuster, wenn Sie den Wert Ihrer Elemente kennen.

    arr=( "${arr[@]/PATTERN/}" )

2
Beachten Sie, dass mit Ausnahme von arr+=(element)und unset arr[2](was sein sollte unset -v 'arr[2]'!) Nicht-spärliche Arrays vorausgesetzt werden. Beachten Sie auch, dass arr=( "${arr[@]/PATTERN/}" )sich die Anzahl der Elemente nicht ändert. Alles was es tun kann, ist sie durch die leere Zeichenkette zu ersetzen.
Stéphane Chazelas

Damit das Entfernen funktioniert, müssen Sie den Index finden, richtig? Wie finde ich es am schnellsten?
Qodeninja

3

Beachten Sie, dass Arrays in bash(kopiert von ksh) eher assoziative Arrays sind.

a=(newvalue "$a[@]")

würde ein neues $aArray mit newvalueas erstellen ${a[0]}und die Elemente des ursprünglichen Arrays in der numerischen Reihenfolge ihres Schlüssels mit den Schlüsseln 1, 2 anhängen ...

Zum Beispiel, wenn Sie:

bash-4.4$ typeset -p a
declare -a a=([0]="foo" [12]="bar")
bash-4.4$ a=(newvalue "${a[@]}")
bash-4.4$ typeset -p a
declare -a a=([0]="newvalue" [1]="foo" [2]="bar")

Das erklärt, warum es dafür keinen eingebauten Operator gibt.

Wenn Sie newvalueas einfügen ${a[0]}und alle anderen Tasten um eins verschieben möchten, benötigen Sie ein temporäres Array:

b=newvalue
for k in "${!a[@]}"; do
  b[k+1]=${a[k]}
done
unset a
for k in "${!b[@]}"; do
  a[k]=${b[k]}
done
unset b

Shells wie zshoder yashdie normale Arrays haben Operatoren dafür:

  • zsh:

    a[1,0]=newvalue

    (Funktioniert auch, wenn skalaren Variablen Zeichenfolgen vorangestellt werden)

  • yash:

    array -i a 0 newvalue

1
"Arrays in bash (kopiert aus ksh) sind eher assoziative Arrays" ?? Ich dachte, es gibt "reguläre" (wenn auch möglicherweise spärliche) und assoziative (wo Sie Strings als Independence verwenden können) Arrays in Bash. Was vermisse ich?
26.

0
# array declaration  
arr=()  

#Function to read data from file a and add into array  
fun_add_in_array()
{  
input=$1  
while IFS=',' read -r f1 f2  
do  
    echo "Element1 : $f1"  
    echo "Element2 : $f2"  
    arr+=( "$f1" )  
done < "$input"  
}  

#Function to print a array  
fun_read_array()  
{  
arr=("$@")  
for i in "${arr[@]}"  
do  
    echo $i  
done  
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.