Variable bash $ {0 ## * /}

8

J'essaie de comprendre la variable ${0##*/}que j'ai rencontrée dans un script bash.

Je comprends que $0contient le nom ou le chemin du script, puis ##fonctionne comme dans ${parameter##pattern}( source ).

Mais je ne comprends pas ce que /fait ici. Je ne connais ce défaut de syntaxe qu'avec deux barres obliques:${parameter/pat/string}

Quand je fais écho à cette variable en bash, je reçois bash:)

Enfin, je n'ai pas l'autorisation de partager le script. Permettez-moi de dire que la variable est appelée SOFT="${0##*/}"et utilisée dans une printfinstruction"Error message sent by $SOFT"

bela83
la source

Réponses:

12

Cela coupe tous les éléments de chemin précédents, tout comme le basename $0ferait. L ' ##essaie de trouver la plus longue extension correspondante du modèle de préfixe:

$ x=/a/b/c/d
$ echo ${x##*/}
d
$ basename $x
d

Depuis la page de manuel:

${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.  

La raison de son utilisation ${0##*/}est qu'elle n'implique pas d'appel de programme externe, mais qu'elle obscurcit ce qui se passe.

Anthon
la source
Juste curieux, comment avez-vous obtenu la page de manuel pour cela?
Psycho Punch
Avez-vous essayé man bashpuis cherché parameter##?
Anthon
Ouais, je l'ai fait man bashmais idiot, j'ai cherché ${donc ça n'a pas trouvé de correspondance. Merci.
Psycho Punch