Estoy bastante confundido acerca de las siguientes expresiones regulares que encontré en un script de shell:
${0##*/}
${0%/*}
¿Cómo trabajan?
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 $0
está 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 .
basename
ydirname
? : D*
) 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.sh
.