¿Cómo funciona $ {! #} En bash para obtener el último argumento de la línea de comandos?

19

De la Guía avanzada de secuencias de comandos Bash, para obtener el último argumento de línea de comandos:

O: lastarg=${!#} Esta es una referencia indirecta a la $#variable.
Tenga en cuenta que lastarg=${!$#}no funciona.

flerb
fuente
44
Por otro lado, el ABS está bastante mal visto como referencia; ver wooledge.org/~greybot/meta/abs para la historia de su factoid en el canal irc.freenode.org # bash. La Wiki de Bash-Hackers y la Guía de Bash de Wooledge no son tan infames por la densidad de imprecisiones. Dentro de este último, las referencias indirectas se cubren en detalle en BashFAQ # 6 ; en el primero, wiki.bash-hackers.org/syntax/pe#indirection
Charles Duffy
1
Solo una pregunta: ¿no es !$más simple y lo mismo?
unxnut

Respuestas:

27

Como dice es una referencia indirecta. Tome el siguiente ejemplo:

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

Ahora si tuviera que establecer los siguientes parámetros posicionales:

$ set -- one two three

Y $#representará el número total de parámetros posicionales:

$ echo $#
3

Esto significa que cuando lo llamo como ${!#}digo, dame el valor del parámetro llamado 3:

$ echo ${!#}
three
Jesse_b
fuente