Есть ли способ сделать что-то вроде PHP $array[] = 'foo';
в Bash против делать:
array[0]='foo'
array[1]='bar'
Есть ли способ сделать что-то вроде PHP $array[] = 'foo';
в Bash против делать:
array[0]='foo'
array[1]='bar'
Ответы:
Да, есть:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
В контексте, где оператор присваивания присваивает значение переменной оболочки или индексу массива (см. Массивы), оператор «+ =» может использоваться для добавления или добавления к предыдущему значению переменной.
ARRAY
это просто заполнитель для фактического имени переменной. Даже если индексы вашего массива не последовательные, добавление с помощью +=
просто назначит наибольший индекс +1.
${myarray[@]}
- ссылка на переменную массива, как если бы это был скаляр, аналогична обращению к его элементу 0; другими словами: так $myarray
же, как ${myarray[0]}
.
Как отмечает Dumb Guy , важно отметить, начинается ли массив с нуля и является ли он последовательным. Поскольку вы можете присваивать и удалять несмежные индексы, ${#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
Вот как получить последний индекс:
$ end=(${!array[@]}) # put all the indices in an array
$ end=${end[@]: -1} # get the last one
$ echo $end
42
Это показывает, как получить последний элемент массива. Вы часто будете видеть это:
$ echo ${array[${#array[@]} - 1]}
g
Как видите, поскольку мы имеем дело с разреженным массивом, это не последний элемент. Это работает как для разреженных, так и для смежных массивов, хотя:
$ echo ${array[@]: -1}
i
${array[@]: start[:count]}
Возвращает количество элементов. или, если не указано, все остальные элементы. начиная со следующего элемента .: - Если старт> = 0: от элемента. чей индекс> = начало. - Если начало <0: от элемента. чей индекс (последний индекс массива + 1) - abs (начало); CAVEAT: если abs (start)> (последний индекс массива + 1), возвращается пустая строка. Если указано количество, возвращается столько элементов, даже если их индексы не являются смежными с самого начала.
${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")
если у вас есть элементы с пробелами в них
Если ваш массив всегда последовательный и начинается с 0, то вы можете сделать это:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Если вы случайно используете пробелы между знаком равенства:
array[${#array[@]}] = 'foo'
Тогда вы получите ошибку, похожую на:
array_name[3]: command not found
+=
синтаксис (см. Ответ @ e-t172) (а) проще, и (б) также работает с массивами, которые не являются смежными и / или не начинаются с 0.
+=
был добавлен, например, версия 2
$arr += ($el)
казалось, разделить строку на пробел и добавить каждый из элементов.
С индексированным массивом вы можете что-то вроде этого:
declare -a a=()
a+=('foo' 'bar')