Comment fonctionnent $ {0 ## * /} et $ {0% / *}?

33

Je suis assez confus au sujet des expressions régulières suivantes trouvées dans un script shell:

${0##*/}
${0%/*}

Comment travaillent-ils?

utilisateur785099
la source

Réponses:

38

Ce ne sont pas des expressions régulières, ce sont des exemples de l'expansion des paramètres de Bash: la substitution d'une variable ou d'un paramètre spécial par sa valeur. Le Wooledge Wiki a une bonne explication .

Fondamentalement, dans l'exemple que vous avez, se ${0##*/}traduit par:

pour la variable $ 0 et le motif '/', les deux hachages signifient que, depuis le début du paramètre, supprimez la correspondance la plus longue (ou gourmande), jusqu'au motif inclus.

Ainsi, où $0est le nom d'un fichier, par exemple., $HOME/documents/doc.txtLe paramètre serait développé comme suit:doc.txt

De même, pour ${0%/*}, le motif /correspond à la fin du paramètre (the %), la correspondance la plus courte ou non gloutonne étant supprimée - ce qui, dans l'exemple ci-dessus, vous en donnerait $HOME/documents.

Voir aussi l'article sur le Wiki de Bash Hacker .

jasonwryan
la source
2
Alors ... ils ne voulaient pas utiliser basenameet dirname? : D
Aaron D. Marasco
8
Un avantage est que la substitution de paramètres ne génère pas de sous-processus ...
jasonwryan
@ jasonwryan, pouvez-vous élaborer la fonctionnalité de * dans les deux exemples ci-dessus? Ou pourquoi nous devons mettre * là. En particulier, dans le premier exemple, * est placé avant //; tandis que dans le deuxième exemple, * est placé après /. Quelle est la différence sous-jacente? Merci.
user785099
3
Le glob ( *) indique que tout ce qui va jusqu'au motif y compris sera supprimé. Par conséquent, pour le début du paramètre, #il est à gauche et à la fin, en %sens inverse.
jasonwryan
5
Ce n'est pas spécifique à bash, c'est spécifié par POSIX sh.
nyuszika7h