formación
Las alternativas más antiguas en bash (desde bash 3.0+) son:
$ a=(aa bb cc dd ee)
$ echo "${a[@]:(-1)} ${a[@]: -1} ${a[@]:(~0)} ${a[@]:~0}"
ee ee ee ee
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:
EVALUACIÓN ARITMÉTICA
! ~ logical and bitwise negation
Desde bash-4.2 + también:
$ echo "${a[-1]} ${a[(~0)]}"
ee ee
Desde bash 5.0+ también:
$ echo "${a[~0]}"
ee
Para todas las versiones de bash (bash más antiguo):
$ echo "${a[ ${#a[@]}-1 ]}" # spaces added **only** for readability
ee
@ @
Para argumentos posicionales (desde bash 2.01):
$ set aa bb cc dd ee
$ echo "${@:(-1)} ${@:~0} ${@: -1} ${@:$#} ${!#}"
ee ee ee ee
Una solución portátil para todos los shells es usar eval:
eval printf '"%s\n"' \"\${$#}\"
$@
no es exactamente una matriz (no se puede suscribir). Para ello, consulte Cómo obtener el último argumento pasado a un script de shell .