Bash脚本中的Unshift数组元素

Dan*_*nny 3 arrays bash shell

我想将元素添加到数组的开头而不是结尾.这在巴什有可能吗?

Sig*_*uza 8

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

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

正如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")'
Run Code Online (Sandbox Code Playgroud)

(有趣的事实: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")'
Run Code Online (Sandbox Code Playgroud)


agc*_*agc 6

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

set - a b c ; echo $1 $3
Run Code Online (Sandbox Code Playgroud)

输出:

a c
Run Code Online (Sandbox Code Playgroud)

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

set - foo "$@" ; echo $1 $3
Run Code Online (Sandbox Code Playgroud)

输出:

foo b
Run Code Online (Sandbox Code Playgroud)