Как я могу удалить элемент в массиве, а затем переместить массив в 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
- Удалить элемент из массива
...
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
Ответ 4
этот пост был пересмотрен и перенесен на свой собственный пост как более углубленный учебник как правильно удалить элемент массива в цикле for.