¿Por qué $ {$ #} devuelve el mismo resultado que $$ en el shell?

18

Al intentar obtener el último parámetro posicional establecido /bin/dash, lo intenté echo ${$#}. Sorprendentemente, esto no resultó en un error, sino en PID, que es lo mismo que el $$contenido variable. Pregunta, ¿por qué funcionó esa sintaxis? ¿Cuál es la regla de sintaxis que Shell aplicó aquí?

Básicamente, lo que hice es

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

Aparentemente, el %personaje también se ignora en tal construcción

$ echo ${$%}
13819

Pero *y el @resultado es un error de sustitución incorrecto:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution
Sergiy Kolodyazhnyy
fuente
3
¿Qué espera ${$*}y ${$@}produce?
Kusalananda
2
@Kusalananda Sin expectativas. Yo estaba tratando al lado de otros personajes #y %y qué resultados de comportamiento de aquellos.
Sergiy Kolodyazhnyy
1
Para hacer realmente indirección en Dash, use eval, por ejemplo dash -c 'set 1 2 3 4 5; eval "echo \$$#"'. Fuente: Ubuntu Wiki
wjandrea
1
@wjandrea Sí, ya consciente de eso. En realidad, ya hay una pregunta al respecto: stackoverflow.com/questions/1853946/ ... Estaba tratando de encontrar un método por mí mismo sin leer primero la pregunta (y ya sabía cómo for i; do true; doneobtener el último elemento $i) pero estaba buscando algo más elegante. evalpor supuesto, puede tener problemas potenciales, en qué medida, ese es otro tema. Pero sí, es una opción
Sergiy Kolodyazhnyy

Respuestas:

35

Esto es $$ con un prefijo vacío eliminado :

${parameter#[word]}

Eliminar el patrón de prefijo más pequeño . La palabra se expandirá para producir un patrón. La expansión del parámetro dará como resultado el parámetro , con la porción más pequeña del prefijo que coincida con el patrón eliminado. Si está presente, la palabra no comenzará con una sin comillas #.

Lo mismo se aplica para %(sufijo). @y *no son modificadores de expansión de parámetros, por lo que son errores. Ocurriría para $?, $-o también para un hipotético $=. ${$+}Es una expansión vacía.

Michael Homer
fuente
Debería haber reconocido la sustitución de parámetros inmediatamente allí. Buena atrapada.
Sergiy Kolodyazhnyy