1 #!/bin/bash
2 # query2.sh
3
4 numbers=(53 8 12 9 784 69 8 7 1)
5 i=4
6
7 echo ${numbers[@]} # <--- this echoes "53 8 12 9 784 69 8 7 1" to stdout.
8 echo ${numbers[i]} # <--- this echoes "784" to stdout.
9
10 unset numbers[i]
11
12 echo ${numbers[@]} # <--- this echoes "53 8 12 9 69 8 7 1" to stdout.
13 echo ${numbers[i]} # <--- stdout is blank.
Pourquoi, à la ligne 13, la sortie standard est-elle vide, étant donné que le tableau semble avoir été mis à jour à en juger par la sortie standard de la ligne 12?
Et par conséquent, que dois-je faire pour obtenir la réponse voulue, "69"?
Réponses:
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
:Observez qu'il
numbers
n'a plus d'élément4
.Un autre exemple
Observer:
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 manquant4
:Si nous voulons que les indices changent, alors:
Il y a maintenant un numéro d'élément
4
et il a une valeur69
.Autre méthode pour supprimer un élément et renuméroter un tableau en une seule étape
Encore une fois, définissons
numbers
: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:
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 slicesnumbers
: il prend les quatre premiers éléments en commençant par l'élément 0.De même,
${numbers[@]:5}
tranche de tableaunumbers
: 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 manquant4
:Pour voir quels indices sont attribués:
Encore une fois, il
4
manque dans la liste des indices.Documentation
De
man bash
:la source
a=()
, la variablea
n'est toujours pas définie jusqu'à ce que vous l'attribuiez réellement à l'un de ses indices.unset numbers[4]
, attribuez le tableau entier en utilisant le découpage, c'est-à-direnumbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
(je posterais comme réponse, mais je n'ai pas le temps de l'expliquer correctement).bash
les tableaux comme dansksh
, ne sont pas vraiment des tableaux, ils ressemblent plus à des tableaux associatifs avec des clés limitées à des entiers positifs (ou soi-disant tableaux clairsemés ). Pour un shell avec des tableaux réels, vous pouvez jeter un oeil à des coquilles commerc
,es
,fish
,yash
,zsh
(ou mêmecsh
/tcsh
si ces obus ont tant de problèmes auxquels ils sont mieux évités).Dans
zsh
:(Notez que dans zsh, le
unset 'a[3]'
définit en fait sur la chaîne vide pour une meilleure compatibilité avecksh
)dans
yash
:dans
fish
(pas un shell de type Bourne contrairement àbash
/zsh
):dans
es
(basé surrc
, pas comme Bourne)dans
ksh
etbash
Vous pouvez utiliser les tableaux comme des tableaux normaux si vous le faites:
après chaque opération de suppression ou d'insertion qui peut avoir rendu la liste des index non contiguës ou ne pas commencer à 0. Notez également que
ksh
/ lesbash
tableaux commencent à 0, pas à 1 (sauf pour$@
(à certains égards)).Cela va en effet ranger les éléments et les déplacer dans l'index 0, 1, 2 ... en séquence.
Notez également que vous devez citer le
number[i]
dans:Sinon, cela serait traité comme
unset numberi
s'il y avait un fichier appelénumberi
dans le répertoire courant.la source