Bash脚本中的数组元素前插

7
我想在数组的开头添加元素而不是末尾。在Bash中是否可能实现这一点?

你可以在数组的开头或结尾进行快速的重新分配,但是在bash中没有任何东西可以插入索引。为什么不尝试编写一个函数来重写数组呢?如果你遇到麻烦,可以在StackOverflow上寻求帮助。我们大多数人都很乐意帮助你修复代码,但通常不愿意充当无偿的短期编程工作人员。 - ghoti
3个回答

11
如果你的数组是连续的,你可以使用 "${array[@]}" 语法来构建一个新的数组:
array=('a' 'b' 'c');
echo "${array[@]}"; # prints: a b c
array=('d' "${array[@]}");
echo "${array[@]}"; # prints: d a b c

正如chepner提到的那样, 上述方法将会合并稀疏数组的索引:

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也是这样做的 - 但话说回来,它是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")'

6

非Bash版本:POSIX Shell 实际上没有数组,除了 shell 参数(即$1、$2、$3等),但对于这些参数,可以使用以下方法:

set - a b c ; echo $1 $3

输出:

a c

现在在开头加入“foo”:
set - foo "$@" ; echo $1 $3

输出:

foo b

4

是的,这是可能的。请看下面的例子:

#!/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")'

1
你可能会发现 declare -p MyArray 是一个有用的方式来可视化你的数组的内容。 - ghoti
或者至少使用 printf '%q\n' "${MyArray[@]}" -- 使用 echo "${MyArray[@]}",你无法区分 MyArray=( hello world )MyArray=( "hello world" ) 的差别。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接