массив
Самые старые альтернативы в bash (начиная с bash 3.0+):
$ a=(aa bb cc dd ee)
$ echo "${a[@]:(-1)} ${a[@]: -1} ${a[@]:(~0)} ${a[@]:~0}"
ee ee ee ee
Пробел необходим, чтобы избежать интерпретации с :
последующим минусом -
как расширением "${var:-abc}"
(Использовать значения по умолчанию).
Это ~
арифметическое побитовое отрицание (эквивалентное дополнению или переворачиванию всех битов ). От человека Баш:
АРИФМЕТИЧЕСКАЯ ОЦЕНКА
! ~ logical and bitwise negation
Начиная с Баш-4.2 + также:
$ echo "${a[-1]} ${a[(~0)]}"
ee ee
Начиная с bash 5.0+ также:
$ echo "${a[~0]}"
ee
Для всех версий bash (более старая версия bash):
$ echo "${a[ ${#a[@]}-1 ]}" # spaces added **only** for readability
ee
@
Для позиционных аргументов (начиная с bash 2.01):
$ set aa bb cc dd ee
$ echo "${@:(-1)} ${@:~0} ${@: -1} ${@:$#} ${!#}"
ee ee ee ee
Переносимым решением для всех оболочек является использование eval:
eval printf '"%s\n"' \"\${$#}\"
$@
не совсем массив (не может быть подписан). Для этого см. Получение последнего аргумента, переданного скрипту оболочки .