如何删除数组中的元素,然后在Shell脚本中移动数组?

时间:2013-07-08 18:10:37

标签: bash shell

首先让我清楚地说明我的问题:

Ex:让我们假装这是我的数组,(元素无关紧要,因为我的实际代码不同):

array=(jim 0 26 chris billy 78 hello foo bar)

现在说我要删除以下元素:

chris 78 hello

所以我在循环遍历数组时做了unset array[$i]。 这会正确地删除元素,但是,我最终得到一个如下所示的数组:

array=(jim 0 26 '' billy '' '' foo bar)

我需要它看起来像这样:

array=(jim 0 26 billy foo bar)

其中 jim 位于索引 0 0 @ 1 26 @ 2 等。< / p>

如何删除数组中的元素并移动其他元素,以便数组中没有空/空格?

谢谢!

4 个答案:

答案 0 :(得分:23)

试试这个:

$ array=( "one two" "three four" "five six" )
$ unset array[1]
$ array=( "${array[@]}" )
$ echo ${array[0]}
one two
$ echo ${array[1]}
five six

Shell数组实际上不是作为可以添加和删除项目的数据结构(它们主要用于为诸如

之类的情况提供第二级引用
arr=( "one two" "three four" )
somecommand "${arr[@]}"

somecommand提供两个而不是四个参数。但这应该适用于大多数情况。

答案 1 :(得分:3)

请参阅http://www.thegeekstuff.com/2010/06/bash-array-tutorial

  1. 从数组中删除元素
  2. ...

    Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
    
    pos=3
    
    Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))})
    

    这使得星球附近的阵列收缩,这是原始海报想要的。

答案 2 :(得分:0)

试试这个:

user@pc:~$ array=(jim 0 26 chris billy 78 hello foo bar)
user@pc:~$ for itm2rm in chris 78 hello; do array=(\`echo ${array[@]} | sed "s/\<${itm2rm}\>//g"\`); done ; echo ${array[@]}
jim 0 26 billy foo bar

答案 3 :(得分:0)

这篇文章已经过修改,并作为更深入的教程how to remove an array element correctly in a for loop

转移到自己的帖子中