有没有办法在不编写函数的情况下添加到bash数组?

时间:2019-02-19 19:31:45

标签: arrays bash

从下面的arrayA值开始。

arrayA=(‘valueA’ ‘valueB’ ‘valueC’)

*…Clever_One_line_Statement_goes_here…*

在…Clever_One_line_Statement之后,arrayA具有值。...

arrayA=(‘’ ‘valueA’ ‘valueB’ ‘valueC’)

5 个答案:

答案 0 :(得分:3)

您可以使用引号正确的参数扩展名:

$ arrayA=('valueA' 'valueB' 'valueC')
$ declare -p arrayA
declare -a arrayA=([0]="valueA" [1]="valueB" [2]="valueC")
$ arrayA=('' "${arrayA[@]}")
$ declare -p arrayA
declare -a arrayA=([0]="" [1]="valueA" [2]="valueB" [3]="valueC")

请注意,我已使用“普通”单引号('');您使用过的“智能”(‘’)会按字面意义进行解释,这几乎肯定不是您想要的。

答案 1 :(得分:1)

如果您不关心性能,那么the answer by @BenjaminW就是很好的选择。另一方面,如果您要对同一阵列重复执行此操作并需要快速,请考虑使阵列稀疏,并保留大量未使用的索引,您可以填写这些索引以快速添加项目。开始:

# Use a larger offset than you'll ever need; here, starting at 10,000
arrayA=( [10000]='valueA' [10001]='valueB' [10002]='valueC' )
arrayIdx=0

# then, to add an empty string at the top of your array, use this one-liner:
arrayA[arrayIdx++]=''

答案 2 :(得分:0)

perl将此操作称为“ unshift”。要将其实现为bash函数(名称引用需要版本4.4 +)

$ unshift() { local -n ary=$1; shift; ary=("$@" "${ary[@]}"); }
$ x=(foo bar baz)
$ unshift x "first value" "second value" "third value"
$ declare -p x
declare -a x=([0]="first value" [1]="second value" [2]="third value" [3]="foo" [4]="bar" [5]="baz")

答案 3 :(得分:0)

另一种方式。

$: declare -a a=( 1 2 3 4 5 6 7 8 9 )
$: echo "${#a[@]}"
9
$:  echo ${a[1]}
2
$: a=( '' "${a[@]}" )
$: echo "${#a[@]}"
10
$: echo ${a[1]}
1
$: unset a[0]
$: echo "${#a[@]}"
9
$: echo ${a[1]}
1

unset会完全删除伪造的单元格0。
所以,简短版-

$: a=( '' "${a[@]}" )
$: unset a[0]

答案 4 :(得分:-3)

下面的一行让我知道了我需要的东西。

cellNameArray=('' ${cellNameArray[*]} )

本杰明W.真的很近。删除双引号并将“ @”替换为“ *”。

感谢本杰明的想法。