协慌网

登录 贡献 社区

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

有没有办法像 PHP 一样$array[] = 'foo';在 bash vs 做:

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

答案

就在这里:

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

Bash 参考手册

在赋值语句为外壳变量或数组索引赋值的情况下(请参见 Arrays),可使用 '+ =' 运算符将其追加或添加到变量的先前值。

正如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
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest