Bash-variabele $ {0 ## * /}

Ik probeer de variabele ${0##*/} die ik ben tegengekomen te begrijpen in een bash-script.

Ik begrijp dat $0 de naam of het pad van het script bevat, en vervolgens ## werkt zoals in ${parameter##pattern} ( source ).

Maar ik begrijp het niet wat de / hier doet. Ik ken deze syntaxis alleen met twee schuine strepen: ${parameter/pat/string}

Wanneer ik echo deze variabele in bash, ik krijg bash 🙂

Ten slotte heb ik niet de autorisatie om het script te delen. Laat me gewoon zeggen dat de variabele SOFT="${0##*/}" heet en wordt gebruikt in een printf -instructie "Error message sent by $SOFT"

Antwoord

Dit verwijdert alle voorgaande padelementen, net zoals basename $0 zou doen. De ## probeert de langste overeenkomende uitbreiding van het voorvoegselpatroon te vinden:

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

Van de man-pagina:

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

De reden voor het gebruik van ${0##*/} is dat het geen externe programma-aanroep inhoudt, maar het verdoezelt wat er aan de hand is.

Opmerkingen

  • Gewoon nieuwsgierig, hoe heb je de man-pagina hiervoor gekregen?
  • Heb je man bash geprobeerd en vervolgens zocht naar parameter##?
  • Ja, ik heb man bash gedaan, maar ik zocht naar ${ dus er is geen overeenkomst gevonden. Bedankt.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *