Como $ {! #} Funciona no bash para obter o último argumento da linha de comando?

19

No Advanced Bash-Scripting Guide, para obter o último argumento da linha de comando:

Ou: lastarg=${!#} esta é uma referência indireta à $#variável.
Observe que lastarg=${!$#}não funciona.

flerb
fonte
4
Como um aparte, o ABS é bastante desaprovado como referência; veja wooledge.org/~greybot/meta/abs para a história de seu factóide no canal irc.freenode.org # bash. O Wiki do Bash-Hackers e o Wooledge BashGuide não são tão famosos pela densidade de imprecisões. Nesse último, as referências indiretas são abordadas em detalhes no BashFAQ # 6 ; no primeiro, wiki.bash-hackers.org/syntax/pe#indirection
Charles Duffy
1
Apenas uma pergunta: não é !$mais simples e o mesmo?
Unxnut # 23/18

Respostas:

27

Como se diz, é uma referência indireta. Veja o seguinte exemplo:

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

Agora, se eu definir os seguintes parâmetros posicionais:

$ set -- one two three

E $#representará o número total de parâmetros posicionais:

$ echo $#
3

Isso significa que quando eu chamo como ${!#}estou dizendo, me dê o valor do parâmetro chamado 3:

$ echo ${!#}
three
Jesse_b
fonte