在Bash中不指定索引的情况下向数组添加新元素

有没有一种方法可以在bash中执行类似于PHP$array[] = 'foo';的操作:

array[0]='foo'array[1]='bar'
731779 次浏览

是的,有:

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

Bash参考手册

在赋值语句将值分配给shell变量或数组索引(请参阅数组)的上下文中,'+='运算符可用于附加或添加到变量的前一个值。

还有:

当使用复合赋值将+=应用于数组变量时(请参阅下面的数组),变量的值不会未设置(与使用=时一样),并且新值将从大于数组最大索引的一个开始附加到数组中(对于索引数组)

如果您的数组始终是顺序的并且从0开始,那么您可以这样做:

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

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

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

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

array_name[3]: command not found
$ declare -a arr$ arr=("a")$ arr=("${arr[@]}" "new")$ echo ${arr[@]}a new$ arr=("${arr[@]}" "newest")$ echo ${arr[@]}a new newest

正如哑巴小子所指出的,重要的是要注意数组是否从零开始并且是顺序的。由于您可以对非连续索引进行赋值和取消设置,${#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 containsdeclare -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 $end42

这说明了如何获取数组的最后一个元素。你会经常看到这个:

$ echo ${array[${#array[@]} - 1]}g

如你所见,因为我们处理的是一个稀疏数组,所以这不是最后一个元素。不过,这适用于稀疏和连续数组:

$ echo ${array[@]: -1}i

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

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