C'è un modo per fare qualcosa di simile a PHP $array[] = 'foo';
in bash vs doing:
array[0]='foo'
array[1]='bar'
C'è un modo per fare qualcosa di simile a PHP $array[] = 'foo';
in bash vs doing:
array[0]='foo'
array[1]='bar'
Risposte:
Si C'è:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
Manuale di riferimento di Bash :
Nel contesto in cui un'istruzione di assegnazione assegna un valore a una variabile di shell o a un indice di array (vedere Array), è possibile utilizzare l'operatore '+ =' per aggiungere o aggiungere al valore precedente della variabile.
ARRAY
è solo un segnaposto per un nome di variabile effettivo. Anche se gli indici dell'array non sono sequenziali, l'aggiunta con +=
verrà semplicemente assegnata all'indice più alto + 1.
${myarray[@]}
- fare riferimento a una variabile di array come se fosse uno scalare equivale ad accedere al suo elemento 0; in altre parole: $myarray
è uguale a ${myarray[0]}
.
Come sottolinea Dumb Guy , è importante notare se l'array inizia da zero ed è sequenziale. Poiché è possibile effettuare assegnazioni e non impostare indici non contigui ${#array[@]}
non è sempre l'elemento successivo alla fine dell'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
Ecco come ottenere l'ultimo indice:
$ end=(${!array[@]}) # put all the indices in an array
$ end=${end[@]: -1} # get the last one
$ echo $end
42
Ciò illustra come ottenere l'ultimo elemento di un array. Vedrai spesso questo:
$ echo ${array[${#array[@]} - 1]}
g
Come puoi vedere, poiché abbiamo a che fare con una matrice sparsa, questo non è l'ultimo elemento. Funziona su matrici sparse e contigue, sebbene:
$ echo ${array[@]: -1}
i
${array[@]: start[:count]}
resi conteggi elems. o, se non specificato, tutti gli elementi rimanenti . a partire dal seguente elem .: - Se start> = 0: dal elem. il cui indice è> = inizio. - Se inizia <0: dall'elem. il cui indice è (ultimo indice dell'array + 1) - abs (inizio); CAVEAT: se abs (inizio)> (ultimo indice dell'array + 1), viene restituita una stringa nulla. Se viene specificato count, vengono restituiti molti elementi, anche se i loro indici non sono contigui dall'inizio.
${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 hai degli elementi con degli spazi
Se l'array è sempre sequenziale e inizia da 0, è possibile farlo:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Se si utilizzano inavvertitamente spazi tra il segno uguale:
array[${#array[@]}] = 'foo'
Quindi riceverai un errore simile a:
array_name[3]: command not found
+=
sintassi (vedi la risposta di @e-t172) è (a) più semplice e (b) funziona anche con array non contigui e / o che non iniziano con 0.
+=
fosse aggiunta, ad es. Versione 2
$arr += ($el)
sembra dividere la stringa per spazio e aggiungere ciascuno degli elementi.
Con un array indicizzato, puoi fare qualcosa del genere:
declare -a a=()
a+=('foo' 'bar')