Variabila Bash $ {0 ## * /}

Încerc să înțeleg variabila ${0##*/} pe care am întâlnit-o într-un script bash.

Înțeleg că $0 conține numele sau calea scriptului, apoi ## funcționează ca în ${parameter##pattern} ( sursă ).

Dar nu înțeleg ceea ce face / aici. Știu acest șir de sintaxă doar cu două bare: ${parameter/pat/string}

Când ecou această variabilă în bash, primesc bash 🙂

În cele din urmă, nu am autorizația de a partaja scriptul. Permiteți-mi să spun că variabila se numește SOFT="${0##*/}" și este utilizată într-o declarație printf "Error message sent by $SOFT"

Răspuns

Aceasta reduce toate elementele căii precedente, la fel ca basename $0 ar face. ## încearcă să găsească cea mai lungă expansiune de potrivire a modelului de prefix:

 $ x=/a/b/c/d $ echo ${x##*/} d $ basename $x d  

Din pagina de manual:

 ${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.  

Motivul utilizării ${0##*/} este că nu implică un apel de program extern, dar este un fel de a ascunde ceea ce se întâmplă.

Comentarii

  • Doar curios, cum ați obținut pagina manuală pentru acest lucru?
  • Ați încercat man bash și apoi am căutat parameter##?
  • Da, am făcut man bash, dar am fost prost, am căutat ${ deci nu a reușit să găsească o potrivire. Mulțumesc.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *