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 $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 .
basenameydirname? : 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.