Как я могу удалить элемент в массиве, а затем переместить массив в Shell Script?

Сначала позвольте мне четко изложить свою проблему:

Ех: предположим, что это мой массив, (элементы не имеют значения, как в моем фактическом коде они меняются):

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 и т.д.

Как удалить элементы в массиве и переместить другие элементы, чтобы в массиве не было пустых/пустых пространств?

Спасибо!

Ответ 1

Попробуйте следующее:

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

Массивы оболочки на самом деле не предназначены как структуры данных, которые вы можете добавлять и удалять из них (они в основном предназначены для обеспечения второго уровня цитирования для таких ситуаций, как

arr=( "one two" "three four" )
somecommand "${arr[@]}"

чтобы предоставить somecommand два, а не четыре аргумента). Но это должно работать в большинстве ситуаций.

Ответ 2

См. 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, который хотел найти оригинальный плакат.

Ответ 3

Попробуйте следующее:

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