Variabile Bash $ {0 ## * /}

Sto cercando di capire la variabile ${0##*/} che ho incontrato in uno script bash.

Capisco che $0 contiene il nome o il percorso dello script, quindi ## funziona come in ${parameter##pattern} ( source ).

Ma non capisco cosa sta facendo / qui. Conosco solo questo nodo di sintassi con due barre: ${parameter/pat/string}

Quando ho echo questa variabile in bash, ottengo bash 🙂

Infine, non ho lautorizzazione per condividere lo script. Consentitemi di dire che la variabile si chiama SOFT="${0##*/}" ed è utilizzata in unistruzione printf "Error message sent by $SOFT"

Risposta

Taglia tutti gli elementi di percorso precedenti, proprio come basename $0 andrebbe bene. ## cerca di trovare lespansione corrispondente più lunga del pattern prefisso:

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

Dalla pagina man:

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

Il motivo per utilizzare ${0##*/} è che non “implica una chiamata di programma esterno, ma oscura in qualche modo cosa sta succedendo.

Commenti

  • Sono solo curioso, come hai ottenuto la pagina man per questo?
  • Hai provato man bash e poi ho cercato parameter##?
  • Sì, ho fatto man bash ma stupido, ho cercato ${ quindi non è riuscito a trovare una corrispondenza. Grazie.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *