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

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.

Comentários

  • Só por curiosidade, como você conseguiu a página do manual para isso?
  • Você já tentou man bash e em seguida, procurei parameter##?
  • Sim, fiz man bash, mas me enganei, procurei ${ então não conseguiu encontrar alguma correspondência. Obrigado.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *