unset
удаляет элемент Он не перенумеровывает оставшиеся элементы.
Мы можем использовать, declare -p
чтобы точно узнать, что происходит с numbers
:
$ unset "numbers[i]"
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Заметьте, что numbers
больше не имеет элемента 4
.
Другой пример
Заметим:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
Массив a
не имеет элементов со 2 по 21. Bash не требует, чтобы индексы массива были последовательными.
Предложенный метод принудительного перенумерации индексов
Начнем с numbers
массива с отсутствующим элементом 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Если мы хотим, чтобы индексы изменились, то:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Теперь есть номер элемента, 4
и он имеет значение 69
.
Альтернативный метод удаления массива элемента и перенумерации за один шаг
Опять давайте определимся numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Как предложил Тоби Спейт в комментариях, метод удаления четвертого элемента и перенумерации остальных элементов за один шаг:
$ numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Как видите, четвертый элемент был удален, а все остальные элементы были перенумерованы.
${numbers[@]:0:4}
массив ломтиков numbers
: он принимает первые четыре элемента, начиная с элемента 0.
Аналогично, ${numbers[@]:5}
массив фрагментов numbers
: он принимает все элементы, начиная с элемента 5 и заканчивая концом массива.
Получение индексов массива
Эти значения массива могут быть получены с ${a[@]}
. Чтобы найти индексы (или ключи ), которые соответствуют этим значениям, используйте ${!a[@]}
.
Например, рассмотрим снова наш массив numbers
с отсутствующим элементом 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Чтобы увидеть, какие индексы присваиваются:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Опять же, 4
отсутствует в списке индексов.
Документация
От man bash
:
unset
Встроенная команда используется для уничтожения массивов. unset name[subscript]
уничтожает элемент массива по индексу subscript
. Отрицательные подписки на индексированные массивы интерпретируются, как описано выше. Необходимо соблюдать осторожность, чтобы избежать нежелательных побочных эффектов, вызванных расширением пути. unset name
, Где name
массив, или unset name[subscript]
, где subscript
это *
или @
, удаляет весь массив.