【发布时间】:2010-12-29 10:04:48
【问题描述】:
有没有办法在 bash vs 中做类似 PHPs $array[] = 'foo'; 的事情:
array[0]='foo'
array[1]='bar'
【问题讨论】:
有没有办法在 bash vs 中做类似 PHPs $array[] = 'foo'; 的事情:
array[0]='foo'
array[1]='bar'
【问题讨论】:
是的,有:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
在赋值语句为 shell 变量或数组索引(请参阅数组)赋值的上下文中,“+=”运算符可用于附加或添加到变量的前一个值。
【讨论】:
ARRAY 只是实际变量名称的占位符。即使您的数组索引不是连续的,附加+= 也只会分配给最高索引+ 1。
${myarray[@]} - 像访问标量一样引用数组变量与访问其元素 0 相同;换句话说:$myarray 与 ${myarray[0]} 相同。
正如 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 元素。从以下元素开始: - 如果开始 >= 0:从元素开始。其索引 >= start。 - 如果 start (last array index + 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 的答案)更简单,并且(b)也适用于不连续和/或不连续的数组不以 0 开头。
+= 之前,例如版本 2
$arr += ($el) 似乎将字符串按空格拆分并添加每个元素。
使用索引数组,您可以这样做:
declare -a a=()
a+=('foo' 'bar')
【讨论】: