Próbuję zrozumieć zmienną ${0##*/}
, którą napotkałem w skrypcie bash.
Rozumiem, że $0
zawiera nazwę lub ścieżkę skryptu, a następnie ##
działa jak w ${parameter##pattern}
( źródło ).
Ale nie rozumiem co robi tutaj /
. Znam tylko ten ułamek składni z dwoma ukośnikami: ${parameter/pat/string}
Kiedy powtórz tę zmienną w bash, otrzymuję bash
🙂
Wreszcie nie mam uprawnień do udostępniania skryptu. Powiem tylko, że zmienna nazywa się SOFT="${0##*/}"
i jest używana w printf
instrukcji "Error message sent by $SOFT"
Odpowiedź
To wycina wszystkie poprzednie elementy ścieżki, tak jak basename $0
wystarczy. ##
próbuje znaleźć najdłuższe pasujące rozwinięcie wzorca prefiksu:
$ x=/a/b/c/d $ echo ${x##*/} d $ basename $x d
Ze strony podręcznika:
${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.
Powodem używania ${0##*/}
jest to, że nie wiąże się to z wywołaniem programu zewnętrznego, ale w pewnym sensie przesłania to, co się dzieje.
man bash
i potem szukałemparameter##
?man bash
, ale głupi ja, szukałem${
, więc nie udało się znaleźć dopasowania. Dzięki.