Voeg een nieuw element toe aan een array zonder de index in Bash op te geven

Is er een manier om iets als PHPs $array[] = 'foo';te doen in bash versus doen:

array[0]='foo'
array[1]='bar'

Antwoord 1, autoriteit 100%

Ja, dat is er:

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

Bash-referentiehandleiding:

In de context waarin een toewijzingsinstructie een waarde toewijst aan een shell-variabele of array-index (zie Arrays), kan de ‘+=’-operator worden gebruikt om toe te voegen aan of toe te voegen aan de vorige waarde van de variabele.


Antwoord 2, autoriteit 5%

Zoals Dumb Guyaangeeft, is het belangrijk op te merken of de array bij nul begint en sequentieel is. Aangezien je niet-aaneengesloten indices kunt toewijzen en uitschakelen, is ${#array[@]}niet altijd het volgende item aan het einde van de array.

$ 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

Zo krijgt u de laatste index:

$ end=(${!array[@]})   # put all the indices in an array
$ end=${end[@]: -1}    # get the last one
$ echo $end
42

Dat illustreert hoe je het laatste element van een array kunt krijgen. Dit zie je vaak:

$ echo ${array[${#array[@]} - 1]}
g

Zoals je kunt zien, omdat we te maken hebben met een schaarse array, is dit niet het laatste element. Dit werkt echter op zowel dunne als aaneengesloten arrays:

$ echo ${array[@]: -1}
i

Antwoord 3, autoriteit 3%

$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest

Antwoord 4, autoriteit 2%

Als je array altijd sequentieel is en begint bij 0, dan kun je dit doen:

array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}

Als u per ongeluk spaties tussen het gelijkteken gebruikt:

array[${#array[@]}] = 'foo'

Dan krijg je een foutmelding die lijkt op:

array_name[3]: command not found

Antwoord 5

Met een geïndexeerde array kun je zoiets als dit doen:

declare -a a=()
a+=('foo' 'bar')

Other episodes