unset
supprime un élément. Il ne renumérote pas les éléments restants.
Nous pouvons utiliser declare -p
pour voir exactement ce qui arrive à numbers
:
$ unset "numbers[i]"
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Observez qu'il numbers
n'a plus d'élément 4
.
Un autre exemple
Observer:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
Le tableau a
ne comporte aucun élément de 2 à 21. Bash n'exige pas que les indices de tableau soient consécutifs.
Méthode suggérée pour forcer une renumérotation des indices
Commençons par le numbers
tableau avec l'élément manquant 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Si nous voulons que les indices changent, alors:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Il y a maintenant un numéro d'élément 4
et il a une valeur 69
.
Autre méthode pour supprimer un élément et renuméroter un tableau en une seule étape
Encore une fois, définissons numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Comme suggéré par Toby Speight dans les commentaires, une méthode pour supprimer le quatrième élément et renuméroter les éléments restants en une seule étape:
$ numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Comme vous pouvez le voir, le quatrième élément a été supprimé et tous les éléments restants ont été renumérotés.
${numbers[@]:0:4}
tableau slices numbers
: il prend les quatre premiers éléments en commençant par l'élément 0.
De même, ${numbers[@]:5}
tranche de tableau numbers
: elle prend tous les éléments en commençant par l'élément 5 et en continuant à la fin du tableau.
Obtention des indices d'un tableau
Les valeurs d'un tableau peuvent être obtenues avec ${a[@]}
. Pour rechercher les indices (ou clés ) correspondant à ces valeurs, utilisez ${!a[@]}
.
Par exemple, considérons à nouveau notre tableau numbers
avec l'élément manquant 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Pour voir quels indices sont attribués:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Encore une fois, il 4
manque dans la liste des indices.
Documentation
De man bash
:
Le unset
builtin est utilisé pour détruire les tableaux. unset name[subscript]
détruit l'élément de tableau à l'index subscript
. Les indices négatifs des tableaux indexés sont interprétés comme décrit ci-dessus. Des précautions doivent être prises pour éviter les effets secondaires indésirables causés par l'expansion du nom de chemin. unset name
, où name
est un tableau, ou unset name[subscript]
, où subscript
est *
ou @
, supprime l'ensemble du tableau.