Ich bin ziemlich verwirrt über die folgenden regulären Ausdrücke, die ich in einem Shell-Skript gefunden habe:
${0##*/}
${0%/*}
Wie arbeiten Sie?
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 $0
ist 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 .
basename
und nicht benutzendirname
? : D*
) 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.sh
.