向数组添加新元素,而不在Bash中指定索引

时间:2009-12-23 08:59:33

标签: bash arrays

有没有办法在bash中执行类似PHP $array[] = 'foo';的操作:

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

5 个答案:

答案 0 :(得分:1317)

是的,有:

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

Bash Reference Manual

  

在赋值语句为shell变量或数组索引赋值(请参阅Arrays)的上下文中,'+ ='运算符可用于追加或添加到变量的先前值。

答案 1 :(得分:67)

正如 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

答案 2 :(得分:43)

$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest

答案 3 :(得分:22)

如果您的数组始终是连续的并且从0开始,则可以执行以下操作:

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

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

如果你无意中在等号之间使用了空格:

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

然后您将收到类似于以下错误:

array_name[3]: command not found

答案 4 :(得分:5)

使用索引数组,您可以这样:

declare -a a=()
a+=('foo' 'bar')