Como $ {0 ## * /} e $ {0% / *} funcionam?

33

Estou bastante confuso sobre as seguintes expressões regulares que encontrei em um script de shell:

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

Como eles funcionam?

user785099
fonte

Respostas:

38

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 $0está o nome de um arquivo, por exemplo,, $HOME/documents/doc.txtentã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 .

jasonwryan
fonte
2
Então ... eles não queriam usar basenamee dirname? : D
Aaron D. Marasco 11/11
8
Uma vantagem é que susbstitution parâmetro não gerar um subprocesso ...
jasonwryan
@ jasonwryan, você pode elaborar a funcionalidade de * nos dois exemplos acima? Ou por que temos que colocar * lá. Especificamente, no primeiro exemplo, * é colocado antes de //; enquanto no segundo exemplo, * é colocado após /. Qual é a diferença subjacente? Obrigado.
user785099
3
O glob ( *) 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.
jasonwryan
5
Não é específico do bash, é especificado pelo POSIX sh.
nyuszika7h