Si tengo una matriz con 5 elementos, por ejemplo:
[a][b][c][d][e]
Usando echo ${myarray[4]}
puedo ver lo que contiene.
Pero, ¿y si no supiera la cantidad de elementos en una matriz dada? ¿Hay alguna manera de leer el último elemento de una matriz de longitud desconocida? es decir, ¿el primer elemento que se lee de derecha a izquierda para cualquier matriz?
Me gustaría saber cómo hacer esto en bash.
$@
no es exactamente una matriz (no se puede suscribir). Para ello, consulte Cómo obtener el último argumento pasado a un script de shell .Respuestas:
Simplemente puede usar un índice negativo
${myarray[-1]}
para obtener el último elemento. Puedes hacer lo mismo para el penúltimo, y así sucesivamente; en Bash:Lo mismo también funciona para la asignación. Cuando dice "expresión" realmente significa una expresión; puede escribir cualquier expresión aritmética allí para calcular el índice, incluida una que calcule utilizando la longitud de la matriz
${#myarray[@]}
explícitamente.fuente
ksh
yzsh
también.zsh
embargo, por defecto, las matrices están indexadas en 1, a diferencia debash
yksh
donde están indexadas en 0.Bash moderno (v4.1 o mejor)
Puedes leer el último elemento en el índice
-1
:El soporte para acceder a matrices indexadas numéricamente desde el final utilizando índices negativos comenzó con la versión bash 4.1-alpha .
Viejo bash (v4.0 o anterior)
Debe obtener la longitud de la matriz
${#a[@]}
y luego restar uno para obtener el último elemento:Como bash trata los subíndices de matriz como una expresión aritmética, no hay necesidad de notación adicional, como
$((...))
forzar la evaluación aritmética.fuente
modern
con una versión.bash
La asignación de matriz, la referencia, el desarmado con índice negativo solo se agregaron en bash 4.3 . Con una versión anterior debash
, puede usar la expresión en el índicearray[${#array[@]-1}]
Otra forma, también funciona con una versión anterior de
bash
(bash 3.0 o mejor):o:
El uso de desplazamiento negativo, es necesario separar
:
con-
para evitar ser confundido con la:-
expansión.fuente
"${a[@]: -1}"
y funcionará (ademásbash
yzsh
) también enksh
.zsh
obash
; pero lo probé en los tres depósitos).formación
Las alternativas más antiguas en bash (desde bash 3.0+) son:
El espacio es necesario para evitar la interpretación de
:
seguido de un signo menos-
como la expansión de"${var:-abc}"
(Usar valores predeterminados).El
~
es una negación aritmética de bits (equivalente al complemento de uno o voltear todos los bits ). De man bash:Desde bash-4.2 + también:
Desde bash 5.0+ también:
Para todas las versiones de bash (bash más antiguo):
@ @
Para argumentos posicionales (desde bash 2.01):
Una solución portátil para todos los shells es usar eval:
fuente
~
en el manual y no lo vi.$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
referencia (verifique la respuesta ampliada en el título @). @TomHale@
es una matriz (bueno, no es completamente una matriz ) en bash y no acepta el subíndice index ( ) para argumentos individuales. Necesitas usar o equivalente. Verifique la entrada expandida en el título. @TomHale[]
${@:(-1)}
@
También puedes hacer esto:
Resultado:
Lo que está haciendo es obtener todo el recuento de elementos en la matriz y restar -1 porque está obteniendo todos los elementos, no comenzando desde el índice de la matriz que es 0.
fuente