Estou tentando entender a variável ${0##*/}
que encontrei em um script bash.
Eu entendo que $0
contém o nome ou o caminho do script e, em seguida, ##
funciona como em ${parameter##pattern}
( fonte ).
Mas eu não entendo o que /
está fazendo aqui. Eu só conheço esta torção de sintaxe com duas barras: ${parameter/pat/string}
Quando eu echo essa variável no bash, obtenho bash
🙂
Finalmente, não tenho autorização para compartilhar o script. Deixe-me apenas dizer que a variável é chamada de SOFT="${0##*/}"
e é usada em uma printf
instrução "Error message sent by $SOFT"
Resposta
Isso corta todos os elementos de caminho anteriores, assim como basename $0
faria. O ##
tenta encontrar a expansão correspondente mais longa do padrão de prefixo:
$ x=/a/b/c/d $ echo ${x##*/} d $ basename $x d
Na página de manual:
${parameter##word} Remove matching prefix pattern. The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches the beginning of the value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ``#"" case) or the longest matching pat‐ tern (the ``##"" case) deleted.
O motivo para usar ${0##*/}
é que não envolve uma chamada de programa externa, mas meio que obscurece o que está acontecendo.
man bash
e em seguida, procureiparameter##
?man bash
, mas me enganei, procurei${
então não conseguiu encontrar alguma correspondência. Obrigado.