Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向数组中添加新元素,而不在Bash中指定索引_Bash_Arrays - Fatal编程技术网

向数组中添加新元素,而不在Bash中指定索引

向数组中添加新元素,而不在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

有没有一种方法可以像PHPs
$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')