Come aggiungere / rimuovere un elemento da / verso l'array in bash?


Risposte:


51

Per aggiungere un elemento all'inizio di un array, utilizzare.

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

In generale, lo faresti.

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

Per aggiungere un elemento alla fine di un array, utilizzare.

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

O invece

arr+=( "new_element" )

In generale, lo faresti.

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

Per aggiungere un elemento a un indice specifico di un array, utilizzare.

Diciamo che vogliamo aggiungere un elemento alla posizione di Index2 arr [2] , in realtà vorremmo fonderci sui sotto-array sottostanti:

  1. Ottieni tutti gli elementi prima dell'indice position2 arr [0] e arr [1] ;
  2. Aggiungi un elemento all'array;
  3. Ottieni tutti gli elementi con Index position2 all'ultimo arr [2] , arr [3] , ....

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

Rimozione di un elemento dall'array

Oltre a rimuovere un elemento da un array (diciamo l'elemento 2), dobbiamo concatenare due sotto-array. Il primo sotto-array conterrà gli elementi prima dell'elemento # 2 e il secondo sotto-array conterrà gli elementi dopo l'elemento # 2.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}otterrà due elementi arr [0] e arr [1] inizia dall'inizio dell'array.
  • ${arr[@]:3}otterrà tutti gli elementi da index3 arr [3] all'ultimo.

Un'altra possibilità per rimuovere un elemento è

  1. Utilizzo unset(in realtà assegna un valore "null" all'elemento)

    unset arr[2]
  2. Usa il modello di sostituzione se conosci il valore dei tuoi elementi.

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

2
Si noti che ad eccezione di arr+=(element)e unset arr[2](che dovrebbe essere unset -v 'arr[2]'!), Che presuppone array non sparsi. Si noti inoltre che il arr=( "${arr[@]/PATTERN/}" )non modifica il numero di elementi. Tutto ciò che può fare è sostituirli con la stringa vuota.
Stéphane Chazelas,

quindi per far funzionare la parte di rimozione devi trovare l'indice, giusto? qual è il modo più veloce per trovarlo?
qodeninja,

3

Si noti che gli array in bash(copiati da ksh) sono piuttosto array associativi.

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

farebbe un nuovo $aarray con newvalueas ${a[0]}e gli elementi dell'array originale aggiunti nell'ordine numerico della loro chiave con i tasti 1, 2 ...

Ad esempio, se avessi:

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")

Questo spiega perché non esiste un operatore integrato per questo.

Se si desidera inserire un newvalueas ${a[0]}e spostare tutte le altre chiavi di una, sarebbe necessario un array temporaneo:

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

Le conchiglie come zsho yashche hanno array normali hanno operatori per questo:

  • zsh:

    a[1,0]=newvalue

    (funziona anche per anteporre stringhe a variabili scalari)

  • yash:

    array -i a 0 newvalue

1
"le matrici in bash (copiate da ksh) sono matrici piuttosto associative" ?? Ho pensato che ci siano array "regolari" (anche se forse sparsi) e associativi (dove puoi usare stringhe come indecie) in bash, cosa mi sto perdendo?
nhed

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  
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.