Variável Bash $ {0 ## * /}

8

Estou tentando entender a variável ${0##*/}que encontrei em um script bash.

Eu entendo que $0contém o nome ou o caminho do script e, em seguida, ##funciona como em ${parameter##pattern}( fonte ).

Mas não entendo o que /está fazendo aqui. Eu só conheço essa torção de sintaxe com duas barras:${parameter/pat/string}

Quando eu ecoar essa variável no bash, recebo bash:)

Por fim, não tenho autorização para compartilhar o script. Deixe-me apenas dizer que a variável é chamada SOFT="${0##*/}"e é usada em uma printfdeclaração"Error message sent by $SOFT"

bela83
fonte

Respostas:

12

Isso corta todos os elementos anteriores do caminho, exatamente como basename $0faria. As ##tentativas de 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 do 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.  

A razão para usar ${0##*/}é que não envolve uma chamada de programa externa, mas está obscurecendo o que está acontecendo.

Anthon
fonte
Apenas curioso, como você conseguiu a página de manual para isso?
Psycho Punch
Você já tentou man bashe depois procurou parameter##?
Anthon
Sim, eu fiz, man bashmas bobo eu, procurei por ${ele não conseguiu encontrar alguma correspondência. Obrigado.
Psycho Punch