Bash脚本中的Unshift数组元素

时间:2016-08-15 16:33:50

标签: arrays bash shell

我想将元素添加到数组的开头而不是结尾。在Bash中这可能吗?

3 个答案:

答案 0 :(得分:7)

如果您的数组是连续的,则可以使用"${array[@]}"语法构造一个新数组:

array=('a' 'b' 'c');
echo "${array[@]}"; # prints: a b c
array=('d' "${array[@]}");
echo "${array[@]}"; # prints: d a b c

作为chepner mentions,上述方法将折叠稀疏数组的索引:

array=([5]='b' [10]='c');
declare -p array; # prints: declare -a array='([5]="b" [10]="c")'
array=('a' "${array[@]}");
declare -p array; # prints: declare -a array='([0]="a" [1]="b" [2]="c")'

(有趣的事实:PHP does that too - 但是又一次,it's PHP:P)

如果需要使用稀疏数组,可以手动迭代数组的索引(${!array[@]})并将它们增加一(使用$((...+1))):

old=([5]='b' [10]='c');
new=('a');
for i in "${!old[@]}"; do
    new["$(($i+1))"]="${old[$i]}";
done;
declare -p new; # prints: declare -a new='([0]="a" [6]="b" [11]="c")'

答案 1 :(得分:3)

是的,有可能,见下面的例子:

#!/bin/bash
MyArray=(Elem1 Elem2);
echo "${MyArray[@]}"
MyArray=(Elem0 "${MyArray[@]}")
echo "${MyArray[@]}"

根据@ ghoti的评论,declare -p MyArray可以用来很好地显示数组的内容。在上面脚本末尾调用时,它输出:

declare -a MyArray='([0]="Elem0" [1]="Elem1" [2]="Elem2")'

答案 2 :(得分:2)

bash 版本: POSIX shell除了shell参数外,实际上没有数组(即 $ 1,$ 2,$ 3,... < / em>),但对于那些参数,这应该有效:

a c

输出:

set - foo "$@" ; echo $1 $3

现在将“ foo ”添加到开头:

foo b

输出:

if(bodyParagraphsnew[i] == "\r\n")
{
bodyParagraphsnew = bodyParagraphsnew.Where(w => w != bodyParagraphsnew[i]).ToArray();
}