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


Answers:


1539

就在这里:

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

Bash参考手册

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


21
在bash 3.2.48(OS X 10.8.2)上可以正常工作。请注意,这ARRAY只是实际变量名的占位符。即使你的数组的下标是连续的,具有附加+=只会分配到最高的指数+ 1
mklement0

3
bash版本4.2.24(1)中是否存在类似内容?
Ali Ismayilov

195
重要的是要注意,ARRAY + =('foo')与ARRAY + ='foo'有所不同,后者将字符串'foo'附加到具有最低键(?)的条目上。
TheConstructor 2013年

8
根据wiki.bash-hackers.org/scripting/bashchanges的说法,此语法最早出现在3.1-alpha1版本中。
David Yaw 2014年

39
@Jas:要访问整个数组,必须使用${myarray[@]}-引用数组变量就好像它是一个标量一样,这与访问其元素0相同;换句话说:$myarray与相同${myarray[0]}
mklement0

76

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

3
好东西; 从不知道子字符串提取语法也可以应用于数组。由反复试验确定的规则是(重击3.2.48):${array[@]: start[:count]}返回计数元素。或(如果未指定)所有剩余元素。从以下elem开始:-如果从> elem开始> = 0 :。索引> =开始。-如果开始<0:从elem。索引为(最后一个数组索引+ 1)-abs(开始); CAVEAT:如果abs(start)>(最后一个数组索引+ 1),则返回一个空字符串。如果指定了count,则返回多少个元素,即使它们的索引从开始就不连续。
mklement0 2012年

3
@mklement:在Bash 4.2中,可以使用负数组下标访问从数组末尾开始计数的元素。${array[-1]}
暂停,直到另行通知。

很高兴知道,谢谢。OS X(从10.8.2版开始)仍使用3.2.48,stackoverflow.com / questions / 10418616 /… 告诉我,很遗憾,“ Apple使用了相当老的Bash版本,因为它们未交付获得许可的代码根据GPL3。”
mklement0 2012年

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

8
适用于不支持e-t172解释的+ =运算符语义的bash版本
akostadinov 2012年

12
一个很好的向后兼容解决方案,但是请注意,如果任何现有元素中都包含空格,则会将它们拆分为多个元素;使用arr=("${arr[@]}" "new"),如果你有他们的空间元素
kbolino

1
这也可以用于推入数组的前面,这正是我所需要的。
托马什Zato -恢复莫妮卡

29

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

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

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

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

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

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

array_name[3]: command not found

5
是的,可以,但是+=语法(请参阅@ e-t172的答案)更简单(a),并且(b)也适用于非连续和/或不以0
开头的数组。– mklement0

老实说,这个解决方案(对我来说)比“ + =”更好,因为后者的长度有时是错误的(添加一个元素时增加两个)...所以我更喜欢这个答复!:)
Pierpaolo Cira

+=添加之前,它也适用于较早版本的bash,例如版本2
Zoey Hewll

1
当您的元素中有空格时,这也适用- $arr += ($el)似乎是按空格分割字符串并添加了每个元素。
最多

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.