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/}" )
αғsнιη
la source
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
Stéphane Chazelas
la source
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  
}
Mahendra
la source