web-dev-qa-db-fra.com

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

J'ai un tableau contenant certains éléments, mais je veux pousser de nouveaux éléments au début du tableau; Comment je fais ça?

65
Gaurav KS

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

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

En général, vous le 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" )

En général, vous le 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.

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

  1. Récupère tous les éléments avant Index position2 arr [0] et arr [1];
  2. Ajoutez un élément au tableau;
  3. Récupère tous les éléments avec Index position2 au dernier arr [2], arr [3], ....

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

Suppression d'un élément du tableau

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

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 l'index3 arr [3] au dernier.

    une manière pratique possible de reconstruire l'arr en excluant l'élément # 3 (arr [2]) à partir de cela:

    del_element=3; arr=( "${arr[@]:0:$((del_element-1))}" "${arr[@]:$del_element}" )
    

    spécifiez l'élément que vous souhaitez exclure dans del_element=.

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

  1. Utilisation de unset (attribue en fait la valeur 'null' à l'élément)

    unset -v 'arr[2]'
    
  2. Utilisez replace pattern si vous connaissez la valeur de vos éléments de tableau pour tronquer leur valeur (remplacez-la par une chaîne vide).

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

Imprimer le tableau

printf '%s\n' "${arr[@]}"
85
αғsнιη

Notez que les tableaux dans bash (copiés depuis ksh) sont des tableaux plutôt associatifs.

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

ferait un nouveau $a tableau avec newvalue comme ${a[0]} et les éléments du tableau d'origine ajoutés dans l'ordre numérique de leur clé avec les touches 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 vouliez insérer le newvalue comme ${a[0]} et décaler toutes les autres clés par une, vous auriez 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 shells comme zsh ou yash qui ont des tableaux normaux ont des opérateurs pour cela:

  • zsh:

    a[1,0]=newvalue
    

    (fonctionne également pour ajouter des chaînes aux variables scalaires)

  • yash:

    array -i a 0 newvalue
    
3
Stéphane Chazelas
# 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  
}
1
Mahendra

Créer un tableau indexé:

$ declare -a A
$ declare -p A

déclarer -a A

Ajoutez quelques éléments au tableau:

$ A+=(foo)
$ A+=(bar)
$ A+=("baz quux")
$ declare -p A

déclarer -a A = ([0] = "foo" [1] = "bar" [2] = "baz quux")

Supprimez l'élément du milieu, ce qui en fait un tableau indexé clairsemé:

$ unset A[1]
$ declare -p A

déclarer -a A = ([0] = "foo" [2] = "baz quux")

Supprimez le dernier élément du tableau indexé clairsemé:

$ unset A[-1]
$ declare -p A

déclarer -a A = ([0] = "foo")

0
Wil