Existe-t-il un moyen de faire quelque chose comme PHP $array[] = 'foo';
en bash vs faire:
array[0]='foo'
array[1]='bar'
Existe-t-il un moyen de faire quelque chose comme PHP $array[] = 'foo';
en bash vs faire:
array[0]='foo'
array[1]='bar'
Réponses:
Oui il y a:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
Dans le contexte où une instruction d'affectation attribue une valeur à une variable shell ou à un index de tableau (voir Tableaux), l'opérateur '+ =' peut être utilisé pour ajouter ou ajouter à la valeur précédente de la variable.
ARRAY
s'agit que d'un espace réservé pour un nom de variable réel. Même si vos indices +=
${myarray[@]}
- référencer une variable de tableau comme s'il s'agissait d'un scalaire revient à accéder à son élément 0; en d'autres termes: $myarray
est le même que ${myarray[0]}
.
Comme le souligne Dumb Guy , il est important de noter si le tableau commence à zéro et est séquentiel. Étant donné que vous pouvez effectuer des affectations et supprimer des index non contigus, ce ${#array[@]}
n'est pas toujours l'élément suivant à la fin du tableau.
$ array=(a b c d e f g h)
$ array[42]="i"
$ unset array[2]
$ unset array[3]
$ declare -p array # dump the array so we can see what it contains
declare -a array='([0]="a" [1]="b" [4]="e" [5]="f" [6]="g" [7]="h" [42]="i")'
$ echo ${#array[@]}
7
$ echo ${array[${#array[@]}]}
h
Voici comment obtenir le dernier index:
$ end=(${!array[@]}) # put all the indices in an array
$ end=${end[@]: -1} # get the last one
$ echo $end
42
Cela illustre comment obtenir le dernier élément d'un tableau. Vous verrez souvent ceci:
$ echo ${array[${#array[@]} - 1]}
g
Comme vous pouvez le voir, comme nous avons affaire à un tableau clairsemé, ce n'est pas le dernier élément. Cela fonctionne à la fois sur des tableaux clairsemés et contigus, cependant:
$ echo ${array[@]: -1}
i
${array[@]: start[:count]}
Renvoie count elems. ou, si non spécifié, tous les elems restants . à partir de l'elem suivant: - Si start> = 0: à partir de l'elem. dont l'index est> = start. - Si départ <0: depuis l'elem. dont l'indice est (dernier indice du tableau + 1) - abs (début); CAVEAT: si abs (début)> (dernier index du tableau + 1), une chaîne nulle est retournée. Si count est spécifié, autant d'éléments sont retournés, même si leurs indices ne sont pas contigus depuis le début.
${array[-1]}
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
arr=("${arr[@]}" "new")
si vous avez des éléments contenant des espaces
Si votre tableau est toujours séquentiel et commence à 0, vous pouvez le faire:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Si vous utilisez par inadvertance des espaces entre le signe égal:
array[${#array[@]}] = 'foo'
Ensuite, vous recevrez une erreur similaire à:
array_name[3]: command not found
+=
syntaxe (voir la réponse de @ e-t172) est (a) plus simple, et (b) fonctionne également avec des tableaux non contigus et / ou ne commençant pas par 0.
+=
être ajouté, par exemple la version 2
$arr += ($el)
semblent diviser la chaîne par espace et ajouter chacun des éléments.
Avec un tableau indexé, vous pouvez faire quelque chose comme ceci:
declare -a a=()
a+=('foo' 'bar')