如何在Shell脚本中删除数组中的元素并将数组移位?

14

首先让我清楚地陈述我的问题:

例如,假设这是我的数组(实际代码中元素可能不同):

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位于索引00@126@2等等。

我该如何删除数组中的元素并将其他元素移动以使得数组中没有空/空缺的位置?

谢谢!

4个回答

27

试试这个:

$ 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两个参数,而不是四个参数。但这在大多数情况下应该可以正常工作。


2
抱歉我有点晚了才标记为正确。这对我很有帮助,谢谢。 - tc90

4

请查看http://www.thegeekstuff.com/2010/06/bash-array-tutorial

  1. 从数组中删除一个元素

...

Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

pos=3

Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))})

这会在原始帖子所需的位置pos周围收缩数组。


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

0

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