web-dev-qa-db-fra.com

Ajouter un nouvel élément à un tableau sans spécifier l'index dans Bash

Existe-t-il un moyen de faire quelque chose comme PHP $array[] = 'foo'; in bash vs doing:

array[0] = 'foo'
array[1] = 'bar'
706
Darryl Hein

Oui il y a:

ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')

Manuel de référence Bash :

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.

1375
Etienne Dechamps

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 assignations et supprimer des index non contigus, ${#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 constater, puisqu'il s'agit d'un tableau fragmenté, ce n'est pas le dernier élément. Cela fonctionne à la fois sur les tableaux fragmentés et contigus, cependant:

$ echo ${array[@]: -1}
i
71
Dennis Williamson
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
48
ghostdog74

Si votre tableau est toujours séquentiel et commence à 0, procédez comme suit:

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
24
Dumb Guy

Avec un tableau indexé, vous pouvez faire quelque chose comme ceci:

declare -a a=()
a+=('foo' 'bar')
5
Grégory Roche