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это * или @, удаляет весь массив.