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)
Як запропонував Toby Speight у коментарях, спосіб видалити четвертий елемент і перенумерувати всі інші елементи за один крок:
$ 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
є *
або @
, видаляє весь масив.