¿Cómo funcionan $ {0 ## * /} y $ {0% / *}?

33

Estoy bastante confundido acerca de las siguientes expresiones regulares que encontré en un script de shell:

${0##*/}
${0%/*}

¿Cómo trabajan?

usuario785099
fuente

Respuestas:

38

Esas no son expresiones regulares, son ejemplos de la expansión de parámetros de Bash: la sustitución de una variable o un parámetro especial por su valor. El Wiki de Wooledge tiene una buena explicación .

Básicamente, en el ejemplo que tiene, se ${0##*/}traduce como:

para la variable $ 0 y el patrón '/', los dos valores hash significan, desde el comienzo del parámetro, eliminar la coincidencia más larga (o codiciosa), hasta el patrón incluido.

Entonces, ¿dónde $0está el nombre de un archivo, por ejemplo $HOME/documents/doc.txt, entonces, el parámetro se expandiría como:doc.txt

Del mismo modo, para ${0%/*}, el patrón /se compara con el final del parámetro (the %), con la coincidencia más corta o no codiciosa eliminada, lo que en el ejemplo anterior le daría $HOME/documents.

Ver también el artículo en la Wiki de Bash Hacker .

jasonwryan
fuente
2
Entonces ... ¿no querían usar basenamey dirname? : D
Aaron D. Marasco
8
Una ventaja es que la sustitución de parámetros no genera un subproceso ...
jasonwryan
@ jasonwryan, ¿puede elaborar la funcionalidad de * en los dos ejemplos anteriores? O por qué tenemos que poner * allí. En específico, en el primer ejemplo, * se coloca antes de //; mientras que en el segundo ejemplo, * se coloca después de /. ¿Cuál es la diferencia subyacente? Gracias.
user785099
3
El glob ( *) indica que todo, hasta el patrón incluido, se eliminará. Por lo tanto, para el comienzo del parámetro, #está a la izquierda y al final %, trabajando en sentido contrario desde la derecha.
jasonwryan
55
No es específico de bash, está especificado por POSIX sh.
nyuszika7h