Ich versuche, die Variable ${0##*/}
zu verstehen, auf die ich gestoßen bin in einem Bash-Skript.
Ich verstehe, dass $0
den Namen oder den Pfad des Skripts enthält, dann ##
funktioniert wie in ${parameter##pattern}
( source ).
Aber ich verstehe nicht Was die /
hier tut. Ich kenne diesen Syntaxknick nur mit zwei Schrägstrichen: ${parameter/pat/string}
Wenn ich Echo dieser Variablen in Bash, ich erhalte bash
🙂
Schließlich habe ich nicht die Berechtigung, das Skript freizugeben. Lassen Sie mich nur sagen, dass die Variable SOFT="${0##*/}"
heißt und in einer printf
-Anweisung "Error message sent by $SOFT"
Antwort
Hiermit werden alle vorhergehenden Pfadelemente abgeschnitten, genau wie basename $0
würde tun. Die ##
versucht, die am längsten passende Erweiterung des Präfixmusters zu finden:
$ x=/a/b/c/d $ echo ${x##*/} d $ basename $x d
Auf 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 von ${0##*/}
ist, dass kein externer Programmaufruf erforderlich ist, aber die Vorgänge irgendwie verdeckt werden.
Kommentare
- Nur neugierig, wie haben Sie die Manpage dazu bekommen?
- Haben Sie
man bash
und versucht dann nachparameter##
gesucht? - Ja, ich habe
man bash
gemacht, aber dumm, ich habe nach${
, daher konnte keine Übereinstimmung gefunden werden. Danke.