Wie funktionieren $ {0 ## * /} und $ {0% / *}?

33

Ich bin ziemlich verwirrt über die folgenden regulären Ausdrücke, die ich in einem Shell-Skript gefunden habe:

${0##*/}
${0%/*}

Wie arbeiten Sie?

user785099
quelle

Antworten:

38

Dies sind keine regulären Ausdrücke, sondern Beispiele für die Parametererweiterung von Bash: die Ersetzung einer Variablen oder eines speziellen Parameters durch ihren Wert. Das Wooledge Wiki hat eine gute Erklärung .

In dem Beispiel, das Sie haben, heißt ${0##*/}das im Grunde :

Für die Variable $ 0 und das Muster '/' bedeuten die beiden Hashes vom Beginn des Parameters an, dass die längste (oder gierigste) Übereinstimmung gelöscht wird - bis einschließlich des Musters.

Also, wo $0ist der Name einer Datei, zB $HOME/documents/doc.txt, dann würde der Parameter wie folgt erweitert:doc.txt

In ähnlicher Weise wird für ${0%/*}das Muster /mit dem Ende des Parameters (the %) abgeglichen , wobei die kürzeste oder nicht gierige Übereinstimmung gelöscht wird - was im obigen Beispiel der Fall wäre $HOME/documents.

Siehe auch den Artikel im Bash Hacker-Wiki .

jasonwryan
quelle
2
Also ... wollten sie basenameund nicht benutzen dirname? : D
Aaron D. Marasco
8
Ein Vorteil ist, dass die Parametersusbstitution keinen Unterprozess erzeugt ...
jasonwryan
@ jasonwryan, können Sie die Funktionalität von * in den beiden obigen Beispielen erläutern? Oder warum wir dort setzen müssen. Im ersten Beispiel steht * vor //; Während im zweiten Beispiel * hinter / steht. Was ist der zugrunde liegende Unterschied? Vielen Dank.
User785099
3
Das glob ( *) zeigt an, dass alles bis einschließlich des Musters gelöscht wird. Für den Anfang des Parameters ist #es also links und für das Ende %umgekehrt.
Jasonwryan
5
Es ist nicht bash-spezifische, es ist angegeben von POSIX sh.
nyuszika7h