Jak działają $ {0 ## * /} i $ {0% / *}?

33

Jestem dość zdezorientowany co do następujących wyrażeń regularnych znalezionych w skrypcie powłoki:

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

Jak oni pracują?

użytkownik785099
źródło

Odpowiedzi:

38

Nie są to wyrażenia regularne, są to przykłady rozszerzenia parametru Basha: podstawienie zmiennej lub parametru specjalnego przez jego wartość. Wiki Wooledge ma dobre wytłumaczenie .

Zasadniczo, w twoim przykładzie, ${0##*/}tłumaczy się jako:

dla zmiennej $ 0 i wzorca „/” dwa skróty oznaczają od początku parametru usunięcie najdłuższego (lub zachłannego) dopasowania - aż do wzorca włącznie.

Gdzie więc $0jest nazwa pliku, np. $HOME/documents/doc.txt, Wówczas parametr zostanie rozwinięty jako:doc.txt

Podobnie, ponieważ ${0%/*}wzorzec /jest dopasowywany do końca parametru (the %), z usuniętym najkrótszym lub niechcianym dopasowaniem - co dałoby ci w powyższym przykładzie $HOME/documents.

Zobacz także artykuł na Wiki Bash Hackera .

jasonwryan
źródło
2
Więc ... nie chcieli używać basenamei dirname? : D
Aaron D. Marasco,
8
Jedną z zalet jest to, że parametr susbstitution nie odradza podprocesu ...
jasonwryan 11.10.11
@ jasonwryan, czy możesz rozwinąć funkcjonalność * w powyższych dwóch przykładach? Lub dlaczego musimy tam umieścić *. W szczególności, w pierwszym przykładzie * jest umieszczone przed //; podczas gdy w drugim przykładzie * jest umieszczone po /. Jaka jest podstawowa różnica? Dzięki.
user785099,
3
Glob ( *) wskazuje, że wszystko do wzorca włącznie włącznie zostanie usunięte. Dlatego na początku parametru #znajduje się po lewej i na końcu %, działając w drugą stronę od prawej.
jasonwryan
5
To nie jest specyficzne dla bash, jest określone przez POSIX sh.
nyuszika7h