Bash-Variable $ {0 ## * /}

8

Ich versuche, die Variable zu verstehen, auf die ${0##*/}ich in einem Bash-Skript gestoßen bin.

Ich verstehe, dass $0der Name oder der Pfad des Skripts enthält und dann ##wie in ${parameter##pattern}( Quelle ) funktioniert .

Aber ich verstehe nicht, was der /hier macht. Ich kenne diesen Knick der Syntax nur mit zwei Schrägstrichen:${parameter/pat/string}

Wenn ich diese Variable in bash wiederhole, bekomme ich bash:)

Schließlich habe ich nicht die Berechtigung, das Skript freizugeben. Lassen Sie mich nur sagen, dass die Variable aufgerufen SOFT="${0##*/}"und in einer printfAnweisung verwendet wird"Error message sent by $SOFT"

bela83
quelle

Antworten:

12

Dies schneidet alle vorhergehenden Pfadelemente, genau wie basename $0dies der Fall wäre. Der ##versucht, die längste übereinstimmende Erweiterung des Präfixmusters zu finden:

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

Von der Manpage:

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

Der Grund für die Verwendung ${0##*/}ist, dass es sich nicht um einen externen Programmaufruf handelt, sondern dass die Vorgänge irgendwie verdeckt werden.

Anthon
quelle
Nur neugierig, wie hast du die Manpage dafür bekommen?
Psycho Punch
Haben Sie es versucht man bashund dann gesucht parameter##?
Anthon
Ja, ich habe es getan, man bashaber dumm mich, ich habe gesucht, ${damit es keine Übereinstimmung gefunden hat. Vielen Dank.
Psycho Punch