有没有办法在 bash 中做类似 PHPs $array[] = 'foo';
的事情:
array[0]='foo'
array[1]='bar'
就在这里:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
在赋值语句为 shell 变量或数组索引(请参阅数组)赋值的上下文中,'+=' 运算符可用于附加或添加到变量的先前值。
还:
当使用复合赋值将 += 应用于数组变量时(请参阅下面的数组),变量的值不会取消设置(就像使用 = 时一样),并且新值将从数组的最大索引大 1 开始附加到数组(对于索引数组)
正如 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
${array[@]: start[:count]}
返回计数元素。或者,如果未指定,则为所有 remaining 元素。从以下元素开始: - 如果 start >= 0:从元素开始。其索引是>= start。 - 如果开始 < 0:来自元素。其索引为 (last array index + 1) - abs(start);注意:如果 abs(start) > (最后一个数组索引 + 1),返回一个空字符串。如果指定了 count ,则返回尽可能多的元素,即使它们的索引从一开始就不连续。
${array[-1]}
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
arr=("${arr[@]}" "new")
+=
变体可能更有效。
如果您的数组始终是连续的并且从 0 开始,那么您可以这样做:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
如果您无意中在等号之间使用了空格:
array[${#array[@]}] = 'foo'
然后您将收到类似于以下内容的错误:
array_name[3]: command not found
+=
语法(请参阅@e-t172 的答案)(a)更简单,并且(b)也适用于不连续和/或不以 0 开头的数组。
+=
之前,例如版本 2
$arr += ($el)
似乎将字符串按空格拆分并添加每个元素。
使用索引数组,您可以像这样:
declare -a a=()
a+=('foo' 'bar')
ARRAY
只是实际变量名称的占位符。即使您的数组索引是非连续的,附加+=
只会分配给最高索引 + 1。${myarray[@]}
- 将数组变量作为标量引用与访问其元素 0 相同;换句话说:$myarray
与${myarray[0]}
相同。