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 ${@:$#}'

$
Другие вопросы по тегам