13

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

例如:假设这是我的数组,(元素并不重要,因为在我的实际代码中它们会有所不同):

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

4 回答 4

25

尝试这个:

$ 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两个而不是四个参数)。但这应该适用于大多数情况。

于 2013-07-08T18:28:35.070 回答
3

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 周围的数组。

于 2016-11-04T15:00:38.770 回答
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
于 2017-05-13T07:37:31.790 回答
0

这篇文章已被修改并移至自己的帖子,作为更深入的教程如何在 for 循环中正确删除数组元素

于 2017-12-10T02:48:58.283 回答