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

7

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

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

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

Quando faço eco desta 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 printf statement "Error message sent by $SOFT"

    
por bela83 06.12.2014 / 09:49

1 resposta

10

Isso reduz 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

Da 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 ele não envolve uma chamada de programa externa, mas está obscurecendo o que está acontecendo.

    
por 06.12.2014 / 09:52