向数组中添加新元素,而不在Bash中指定索引
有没有一种方法可以像PHPs向数组中添加新元素,而不在Bash中指定索引,bash,arrays,Bash,Arrays,有没有一种方法可以像PHPs$array[]='foo'在bash中与执行: array[0]='foo' array[1]='bar' 是的,有: ARRAY=() ARRAY+=('foo') ARRAY+=('bar') : 在赋值语句将值赋给shell变量或数组索引(请参见数组)的上下文中,“+=”运算符可用于追加或添加变量的上一个值 如果阵列始终是连续的,并且从0开始,则可以执行以下操作: array[${#array[@]}]='foo' # gets the length o
$array[]='foo'代码>在bash中与执行:
array[0]='foo'
array[1]='bar'
是的,有:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
:
在赋值语句将值赋给shell变量或数组索引(请参见数组)的上下文中,“+=”运算符可用于追加或添加变量的上一个值
如果阵列始终是连续的,并且从0开始,则可以执行以下操作:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
如果无意中在等号之间使用空格:
array[${#array[@]}] = 'foo'
然后,您将收到类似以下内容的错误:
array_name[3]: command not found
正如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 a=()
a+=('foo' 'bar')
对于不支持e-T172解释的+=运算符语义的bash版本来说,这是一个很好的向后兼容解决方案,但要注意,如果任何现有元素中有空格,它们将被拆分为多个元素;使用arr=(“${arr[@]}”“new”)
如果元素中有空格,也可以用来推到数组前面,这正是我所需要的。这在bash 3.2.48(OS X 10.8.2)中很好地工作。请注意,ARRAY
只是实际变量名的占位符。即使您的数组索引不是连续的,添加++=
也会简单地分配给最高的索引+1。bash版本4.2.24(1)中是否有类似的情况?需要注意的是,数组+=('foo')与数组+='foo'有很大不同,后者将字符串'foo'附加到具有最低(?)键的条目中。根据,此语法最初出现在版本3.1-alpha1中。@Jas:若要访问整个数组,必须使用${myarray[@]}
-将数组变量作为标量引用与访问其元素0相同;换句话说:$myarray
与${myarray[0]}
相同。是的,你可以,但是+=
语法(见@e-t172的答案)更简单,(a)也适用于不连续和/或不以0开头的数组。老实说,这个解决方案(对我来说)比“+=”更有效,因为对于后者,长度有时是错误的(添加一个元素时增加两个)。。。所以我更喜欢这个回答!:)在添加+=
之前的早期版本bash中也可以使用此功能,例如第2版当元素中有空格时也可以使用此功能-$arr+=($el)
似乎可以按空格拆分字符串并添加每个元素;从来不知道子字符串提取语法也可以应用于数组;通过反复试验确定的规则是(bash 3.2.48):${array[@]:start[:count]}
返回count元素。或者,如果未指定,则为所有剩余元素。从以下元素开始。:-如果开始>=0:从元素开始。其索引为>=开始。-如果开始<0:从元素开始。其索引为(最后一个数组索引+1)-abs(开始);警告:如果abs(start)>(最后一个数组索引+1),则返回空字符串。如果指定了count,则返回的元素数量相同,即使它们的索引从一开始就不连续。@mkelement:在Bash 4.2中,可以使用负数组下标来访问从数组末尾开始计数的元素<代码>${array[-1]}
很高兴知道,谢谢。OSX(从10.8.2开始)仍然使用3.2.48,并且告诉我,不幸的是,“苹果使用的是相当旧的Bash版本,因为他们不提供根据GPL3授权的代码。”
declare -a a=()
a+=('foo' 'bar')