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')