Existe uma maneira de fazer algo como PHPs $array[] = 'foo';no bash vs doing:
array[0]='foo'
array[1]='bar'
Existe uma maneira de fazer algo como PHPs $array[] = 'foo';no bash vs doing:
array[0]='foo'
array[1]='bar'
Respostas:
Sim existe:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
Manual de Referência do Bash :
No contexto em que uma instrução de atribuição está atribuindo um valor a uma variável de shell ou índice de matriz (consulte Matrizes), o operador '+ =' pode ser usado para acrescentar ou adicionar ao valor anterior da variável.
ARRAYé apenas um espaço reservado para um nome de variável real. Mesmo que seus índices de matriz são não sequencial, acrescentando com +=simplesmente atribuir ao maior índice de + 1.
${myarray[@]}- referenciar uma variável da matriz como se ela fosse um escalar é o mesmo que acessar seu elemento 0; em outras palavras: $myarrayé o mesmo que ${myarray[0]}.
Como Dumb Guy aponta, é importante observar se a matriz começa em zero e é seqüencial. Como você pode fazer atribuições e definir índices ${#array[@]}não contíguos nem sempre é o próximo item no final da matriz.
$ 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
Veja como obter o último índice:
$ end=(${!array[@]}) # put all the indices in an array
$ end=${end[@]: -1} # get the last one
$ echo $end
42
Isso ilustra como obter o último elemento de uma matriz. Você verá frequentemente isso:
$ echo ${array[${#array[@]} - 1]}
g
Como você pode ver, porque estamos lidando com uma matriz esparsa, esse não é o último elemento. Isso funciona em matrizes esparsas e contíguas, no entanto:
$ echo ${array[@]: -1}
i
${array[@]: start[:count]}Retorna a contagem de elementos. ou, se não especificado, todos os elementos restantes . começando no seguinte elem .: - Se iniciar> = 0: a partir do elem. cujo índice é> = start. - Se começar <0: do elem. cujo índice é (último índice da matriz + 1) - abs (início); CAVEAT: se abs (início)> (último índice da matriz + 1), uma string nula é retornada. Se count for especificado, muitos elementos serão retornados, mesmo que seus índices não sejam contíguos desde o início.
${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")se você tem elementos com espaços entre eles
Se sua matriz é sempre seqüencial e inicia em 0, você pode fazer o seguinte:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Se você inadvertidamente usar espaços entre o sinal de igual:
array[${#array[@]}] = 'foo'
Você receberá um erro semelhante a:
array_name[3]: command not found
+=sintaxe (consulte a resposta da @ e-t172) é (a) mais simples e (b) também funciona com matrizes que não são contíguas e / ou não começam com 0.
+=adição, por exemplo, versão 2
$arr += ($el)pareciam dividir a cadeia por espaço e adicionar cada um dos elementos.
Com uma matriz indexada, é possível algo como isto:
declare -a a=()
a+=('foo' 'bar')