【问题标题】:Unshift array element in Bash script在 Bash 脚本中取消移位数组元素
【发布时间】:2016-12-21 21:31:29
【问题描述】:

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

【问题讨论】:

  • 您可以在数组的开头或结尾快速重新分配数组,但 bash 中没有任何内容可以插入索引。为什么不尝试编写一个函数来重写数组,如果遇到问题,请在 StackOverflow 上寻求帮助?我们中的大多数人都很乐意帮助您修复代码,但通常不愿意充当无偿的短订单编程人员。

标签: arrays bash shell


【解决方案1】:

如果你的数组是连续的,你可以使用"${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")'

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您可能会发现declare -p MyArray 是一种可视化数组内容的有用方法。
    • ...或至少printf '%q\n' "${MyArray[@]}" -- 与echo "${MyArray[@]}",您无法区分MyArray=( hello world )MyArray=( "hello world" ) 之间的区别
    【解决方案3】:

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

    set - a b c ; echo $1 $3
    

    输出:

    a c
    

    现在在开头添加“foo”:

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

    输出:

    foo b
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2016-11-07
      相关资源
      最近更新 更多