Comment ajouter / supprimer un élément dans / du tableau dans bash?


Réponses:


52

Pour ajouter un élément au début d'un tableau, utilisez.

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

Généralement, vous feriez.

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

Pour ajouter un élément à la fin d'un tableau, utilisez.

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

Ou à la place

arr+=( "new_element" )

Généralement, vous feriez.

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

Pour ajouter un élément à un index spécifique d'un tableau, utilisez.

Supposons que nous voulions ajouter un élément à la position de Index2 arr [2] , nous ferions en fait de fusionner les sous-tableaux ci-dessous:

  1. Obtenir tous les éléments avant Index position2 arr [0] et arr [1] ;
  2. Ajouter un élément au tableau;
  3. Obtenir tous les éléments avec Index position2 jusqu'au dernier arr [2] , arr [3] , ....

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

Supprimer un élément du tableau

En plus de supprimer un élément d'un tableau (disons l'élément # 2), nous devons concaténer deux sous-tableaux. Le premier sous-tableau contiendra les éléments avant l'élément n ° 2 et le second sous-tableau contiendra les éléments après l'élément n ° 2.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}obtiendra deux éléments arr [0] et arr [1] commence au début du tableau.
  • ${arr[@]:3}obtiendra tous les éléments de index3 arr [3] au dernier.

Une autre possibilité de supprimer un élément est

  1. Utiliser unset(assigner réellement une valeur 'null' à l'élément)

    unset arr[2]
  2. Utilisez le motif de remplacement si vous connaissez la valeur de vos éléments.

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

2
Notez que sauf pour arr+=(element)et unset arr[2](ce qui devrait être unset -v 'arr[2]'!), Cela suppose des tableaux non clairsemés. Notez également que le arr=( "${arr[@]/PATTERN/}" )ne change pas le nombre d'éléments. Tout ce qu'il peut faire est de les remplacer par la chaîne vide.
— Stéphane Chazelas

donc pour que la suppression de la pièce fonctionne, vous devez trouver l'index, non? Quel est le moyen le plus rapide de le trouver?
— Qodeninja

3

Notez que les tableaux de bash(copiés à partir de ksh) sont plutôt des tableaux associatifs.

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

créerait un nouveau $atableau avec newvalueas ${a[0]}et les éléments du tableau d'origine ajoutés dans l'ordre numérique de leur clé avec les clés 1, 2 ...

Par exemple, si vous aviez:

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

Cela explique pourquoi il n'y a pas d'opérateur intégré pour cela.

Si vous voulez insérer le newvalueas ${a[0]}et décaler toutes les autres clés, vous avez besoin d'un tableau temporaire:

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

Les shell similaires zshou yashayant des tableaux normaux ont des opérateurs pour cela:

  • zsh:

    a[1,0]=newvalue

    (Fonctionne également pour les chaînes ajoutées aux variables scalaires)

  • yash:

    array -i a 0 newvalue

1
"Les tableaux de bash (copiés à partir de ksh) sont plutôt des tableaux associatifs" ?? Je pensais qu'il y avait des tableaux "normaux" (quoique éventuellement rares) et associatifs (où vous pouvez utiliser des chaînes de caractères comme des mots indécés) dans bash, que me manque-t-il?
— Nhed le

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  
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.