Czy istnieje sposób na zrobienie czegoś takiego jak PHP $array[] = 'foo';
w bash vs robienie:
array[0]='foo'
array[1]='bar'
Czy istnieje sposób na zrobienie czegoś takiego jak PHP $array[] = 'foo';
w bash vs robienie:
array[0]='foo'
array[1]='bar'
Odpowiedzi:
Tak jest:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
Podręcznik referencyjny Bash :
W kontekście, w którym instrukcja przypisania przypisuje wartość do zmiennej powłoki lub indeksu tablicy (patrz Tablice), operator „+ =” może być użyty do dołączenia lub dodania do poprzedniej wartości zmiennej.
ARRAY
jest to tylko symbol zastępczy rzeczywistej nazwy zmiennej. Nawet jeśli indeksy tablicowe nie są sekwencyjne, dołączenie za pomocą +=
spowoduje przypisanie do najwyższego indeksu + 1.
${myarray[@]}
- odwołanie do zmiennej tablicowej, tak jakby to był skalar, jest tym samym, co dostęp do jej elementu 0; innymi słowy: $myarray
jest taki sam jak ${myarray[0]}
.
Jak zauważa Dumb Guy , ważne jest, aby pamiętać, że tablica zaczyna się od zera i jest sekwencyjna. Ponieważ można przypisywać i usuwać nieciągłe indeksy, ${#array[@]}
nie zawsze jest to następny element na końcu tablicy.
$ 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
Oto jak uzyskać ostatni indeks:
$ end=(${!array[@]}) # put all the indices in an array
$ end=${end[@]: -1} # get the last one
$ echo $end
42
To ilustruje, jak uzyskać ostatni element tablicy. Często zobaczysz to:
$ echo ${array[${#array[@]} - 1]}
g
Jak widać, ponieważ mamy do czynienia z rzadką tablicą, nie jest to ostatni element. Działa to zarówno na tablicach rzadkich, jak i przyległych:
$ echo ${array[@]: -1}
i
${array[@]: start[:count]}
Zwraca liczbę elementów. lub, jeśli nie określono, wszystkie pozostałe elementy. zaczynając od następującego elementu: - Jeśli start> = 0: od elementu. którego indeks wynosi> = start. - Jeśli start <0: od elem. którego indeks to (ostatni indeks tablicy + 1) - abs (start); CAVEAT: jeśli abs (start)> (ostatni indeks tablicy + 1), zwracany jest ciąg pusty. Jeśli podano count, zwracanych jest wiele elementów, nawet jeśli ich indeksy nie są ciągłe od początku.
${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")
jeśli masz elementy ze spacjami
Jeśli tablica jest zawsze sekwencyjna i zaczyna się od 0, możesz to zrobić:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Jeśli przypadkowo użyjesz spacji między znakiem równości:
array[${#array[@]}] = 'foo'
Następnie pojawi się błąd podobny do:
array_name[3]: command not found
+=
składnia (patrz odpowiedź @ e-t172) jest (a) prostsza i (b) działa również z tablicami, które nie są ciągłe i / lub nie zaczynają się od 0.
+=
została dodana, np. Wersja 2
$arr += ($el)
wydawało się, że dzieli ciąg znaków przez spację i dodaje każdy z elementów.
Z indeksowaną tablicą możesz wykonać coś takiego:
declare -a a=()
a+=('foo' 'bar')