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.
man bash
och sökte sedan efterparameter##
?man bash
men dumt mig, jag sökte efter${
så det kunde inte hitta någon matchning. Tack.