Как $ {! #} Работает в bash, чтобы получить последний аргумент командной строки?

19

Из Расширенного руководства по написанию сценариев, чтобы получить последний аргумент командной строки:

Или: lastarg=${!#} это косвенная ссылка на $#переменную.
Обратите внимание, что lastarg=${!$#}это не работает.

flerb
источник
4
Кроме того, АБС довольно не одобряется в качестве ссылки; см. wooledge.org/~greybot/meta/abs для ознакомления с историей его фактоида в канале irc.freenode.org # bash. Вики Баш-хакеров и Wooledge BashGuide не столь печально известной плотности для неточностей. В последнем случае косвенные ссылки подробно описаны в BashFAQ # 6 ; в первом wiki.bash-hackers.org/syntax/pe#indirection
Чарльз Даффи,
1
Просто вопрос: не !$проще ли и то же самое?
unxnut

Ответы:

27

Как говорится, это косвенная ссылка. Возьмите следующий пример:

$ var=test
$ test='Hello, world'
$ echo ${!var}
Hello, world

Теперь, если бы я должен был установить следующие позиционные параметры:

$ set -- one two three

И $#будет представлять общее количество позиционных параметров:

$ echo $#
3

Это означает, что когда я называю это так, как ${!#}я говорю, дайте мне значение параметра с именем 3:

$ echo ${!#}
three
Jesse_b
источник