unset
elimina un elemento No renumera los elementos restantes.
Podemos usar declare -p
para ver exactamente qué sucede con 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 numbers
ya no tiene un elemento 4
.
Otro ejemplo
Observar:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
La matriz a
no tiene elementos del 2 al 21. Bash no requiere que los índices de la matriz sean consecutivos.
Método sugerido para forzar una nueva numeración de los índices.
Comencemos con la numbers
matriz con el elemento que falta 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Si queremos que cambien los índices, entonces:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Ahora hay un número de elemento 4
y tiene valor 69
.
Método alternativo para eliminar un elemento y renumerar la matriz en un solo paso
Nuevamente, definamos numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Como lo sugiere Toby Speight en los comentarios, un método para eliminar el cuarto elemento y volver a numerar los elementos restantes en un solo paso:
$ 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 puede ver, el cuarto elemento se eliminó y todos los elementos restantes se volvieron a numerar.
${numbers[@]:0:4}
matriz de rebanadas numbers
: toma los primeros cuatro elementos comenzando con el elemento 0.
Del mismo modo, ${numbers[@]:5}
matriz de corte numbers
: toma todos los elementos que comienzan con el elemento 5 y continúan hasta el final de la matriz.
Obteniendo los índices de una matriz
Los valores de una matriz se pueden obtener con ${a[@]}
. Para encontrar los índices (o claves ) que corresponden a esos valores, use ${!a[@]}
.
Por ejemplo, considere nuevamente nuestra matriz numbers
con el elemento que falta 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 qué índices se asignan:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Nuevamente, 4
falta en la lista de índices.
Documentación
De man bash
:
El unset
builtin se usa para destruir matrices. unset name[subscript]
destruye el elemento de matriz en el índice subscript
. Los subíndices negativos a las matrices indexadas se interpretan como se describe anteriormente. Se debe tener cuidado para evitar los efectos secundarios no deseados causados por la expansión del nombre de ruta. unset name
, where name
es una matriz, o unset name[subscript]
, where subscript
is *
o @
, elimina la matriz completa.