Добавить новый элемент в массив без указания индекса в Bash - PullRequest
687 голосов
/ 23 декабря 2009

Есть ли способ сделать что-то вроде PHPs $array[] = 'foo'; в bash вместо:

array[0] = 'foo'
array[1] = 'bar'

Ответы [ 5 ]

1338 голосов
/ 23 декабря 2009

Да, есть:

ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')

Справочное руководство Bash :

В контексте, где оператор присваивания присваивает значение переменной оболочки или индексу массива (см. Массивы), оператор ‘+ =’ может использоваться для добавления или добавления к предыдущему значению переменной.

68 голосов
/ 23 декабря 2009

Как указывает 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
45 голосов
/ 23 декабря 2009
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
23 голосов
/ 23 декабря 2009

Если ваш массив всегда последовательный и начинается с 0, то вы можете сделать это:

array[${#array[@]}]='foo'

# gets the length of the array
${#array_name[@]}

Если вы случайно используете пробелы между знаком равенства:

array[${#array[@]}] = 'foo'

Тогда вы получите сообщение об ошибке, похожее на:

array_name[3]: command not found
5 голосов
/ 18 февраля 2017

С индексированным массивом вы можете что-то вроде этого:

declare -a a=()
a+=('foo' 'bar')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...