Estou bastante confuso sobre as seguintes expressões regulares que encontrei em um script de shell:
${0##*/}
${0%/*}
Como eles funcionam?
Essas não são expressões regulares, são exemplos da expansão de parâmetros do Bash: a substituição de uma variável ou de um parâmetro especial por seu valor. A Wiki Wooledge tem uma boa explicação .
Basicamente, no exemplo que você tem, ${0##*/}
traduz como:
para a variável $ 0 e o padrão '/', os dois hashes significam desde o início do parâmetro, exclua a correspondência mais longa (ou gananciosa) - até e incluindo o padrão.
Então, onde $0
está o nome de um arquivo, por exemplo,, $HOME/documents/doc.txt
então o parâmetro seria expandido como:doc.txt
Da mesma forma, para ${0%/*}
, o padrão /
é comparado com o final do parâmetro (the %
), com a correspondência mais curta ou não gananciosa excluída - o que no exemplo acima forneceria $HOME/documents
.
Veja também o artigo no Wiki do Bash Hacker .
basename
edirname
? : D*
) indica que tudo, inclusive o padrão, será excluído. Portanto, para o início do parâmetro,#
ele fica à esquerda e ao final%
, trabalhando na outra direção da direita.sh
.