Bash-variabel $ {0 ## * /} (Svenska)

Jag försöker förstå variabeln ${0##*/} som jag stötte på i ett bash-skript.

Jag förstår att $0 innehåller skriptets namn, eller sökvägen, och sedan ## fungerar som i ${parameter##pattern} ( källa ).

Men jag förstår inte vad / gör här. Jag känner bara till denna syntax med två snedstreck: ${parameter/pat/string}

När jag echo denna variabel i bash, jag får bash 🙂

Slutligen har jag inte behörighet att dela skriptet. Låt mig bara säga att variabeln heter SOFT="${0##*/}" och används i ett printf uttalande "Error message sent by $SOFT"

Svar

Detta skär av alla föregående banelement, precis som basename $0 skulle göra. ## försöker hitta den längsta matchande expansionen av prefixmönstret:

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

Från mansidan:

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

Anledningen till att använda ${0##*/} är att det inte involverar ett externt programanrop, men det är något som döljer vad som händer.

Kommentarer

  • Bara nyfiken, hur fick du mansidan för detta?
  • Har du provat man bash och sökte sedan efter parameter##?
  • Ja, jag gjorde man bash men dumt mig, jag sökte efter ${ så det kunde inte hitta någon matchning. Tack.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *