Zmienna Bash $ {0 ## * /}

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.

Komentarze

  • Ciekawe, skąd masz do tego stronę podręcznika?
  • Czy próbowałeś już man bash i potem szukałem parameter##?
  • Tak, zrobiłem man bash, ale głupi ja, szukałem ${, więc nie udało się znaleźć dopasowania. Dzięki.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *