matriz
As alternativas mais antigas no bash (Desde o bash 3.0+) são:
$ a=(aa bb cc dd ee)
$ echo "${a[@]:(-1)} ${a[@]: -1} ${a[@]:(~0)} ${a[@]:~0}"
ee ee ee ee
O espaço é necessário para evitar a interpretação de :
seguido por um sinal de menos -
como a expansão de "${var:-abc}"
(Usar valores padrão).
A ~
é uma negação aritmética bit a bit (equivalente ao complemento de uma pessoa ou inverter todos os bits ). De man bash:
AVALIAÇÃO ARITMÉTICA
! ~ logical and bitwise negation
Desde o bash-4.2 + também:
$ echo "${a[-1]} ${a[(~0)]}"
ee ee
Desde o bash 5.0 ou superior:
$ echo "${a[~0]}"
ee
Para todas as versões do bash (bash mais antigo):
$ echo "${a[ ${#a[@]}-1 ]}" # spaces added **only** for readability
ee
@
Para argumentos posicionais (desde o bash 2.01):
$ set aa bb cc dd ee
$ echo "${@:(-1)} ${@:~0} ${@: -1} ${@:$#} ${!#}"
ee ee ee ee
Uma solução portátil para todos os shells é usar eval:
eval printf '"%s\n"' \"\${$#}\"
$@
não é exatamente uma matriz (não pode ser subscrito). Para isso, consulte Obtendo o último argumento passado para um shell script .