unsetremove um elemento Não renumera os elementos restantes.
Podemos usar declare -ppara ver exatamente o que acontece com 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")
Observe que numbersnão há mais um elemento 4.
Outro exemplo
Observar:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
A matriz anão possui elementos 2 a 21. O Bash não exige que os índices da matriz sejam consecutivos.
Método sugerido para forçar uma renumeração dos índices
Vamos começar com a numbersmatriz com o elemento ausente 4:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Se gostaríamos que os índices mudassem, então:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Agora existe um número de elemento 4e ele tem valor 69.
Método alternativo para remover um elemento e renumerar uma matriz em uma etapa
Novamente, vamos definir numbers:
$ numbers=(53 8 12 9 784 69 8 7 1)
Conforme sugerido por Toby Speight nos comentários, um método para remover o quarto elemento e renumerar os elementos restantes em uma única etapa:
$ 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")
Como você pode ver, o quarto elemento foi removido e todos os elementos restantes foram renumerados.
${numbers[@]:0:4}matriz de fatias numbers: leva os quatro primeiros elementos começando com o elemento 0.
Da mesma forma, ${numbers[@]:5}array de fatias numbers: leva todos os elementos começando com o elemento 5 e continuando até o final do array.
Obtendo os índices de uma matriz
Os valores de uma matriz podem ser obtidos com ${a[@]}. Para encontrar os índices (ou chaves ) que correspondem a esses valores, use ${!a[@]}.
Por exemplo, considere novamente nossa matriz numberscom o elemento ausente 4:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Para ver quais índices estão atribuídos:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Novamente, 4está faltando na lista de índices.
Documentação
De man bash:
O unsetbuiltin é usado para destruir matrizes. unset name[subscript]destrói o elemento da matriz no índice subscript. Os subscritos negativos para matrizes indexadas são interpretados como descrito acima. Deve-se tomar cuidado para evitar efeitos colaterais indesejados causados pela expansão do nome do caminho. unset name, onde nameé uma matriz, ou unset name[subscript], onde subscripté * ou @, remove a matriz inteira.