zsh: доступ к последнему аргументу командной строки, заданному сценарию
Я хочу получить последний элемент $*
, Лучшее, что я нашел до сих пор:
last=`eval "echo \\\$$#"`
Но это кажется слишком непрозрачным.
3 ответа
Решение
В Zsh вы можете использовать P
флаг или параметр расширения параметра @
как массив, содержащий позиционные параметры:
last=${(P)#}
last=${@[$#]}
Способ, который работает во всех оболочках в стиле Борна, включая zsh,
eval last=\$$#
(Вы были на правильном пути, но бежали echo
просто получать его вывод бессмысленно.)
last=${@[-1]}
должен сделать свое дело. В более общем смысле,
${@[n]}
даст параметр *n*th, а
${@[-n]}
выдаст *n*th до последнего параметра.
Расширение параметров двоеточия отсутствует в POSIX, но это работает как минимум в zsh, bash и ksh:
${@:$#}
Когда нет аргументов, ${@:$#}
рассматривается как $0
в zsh и ksh, но как пустой в bash:
$ zsh -c 'echo ${@:$#}'
zsh
$ ksh -c 'echo ${@:$#}'
ksh
$ bash -c 'echo ${@:$#}'
$