Variable Bash $ {0 ## * /}

8

Estoy tratando de entender la variable ${0##*/}que encontré en un script bash.

Entiendo que $0contiene el nombre, o la ruta, del script, luego ##funciona como en ${parameter##pattern}( fuente ).

Pero no entiendo qué /está haciendo aquí. Solo conozco este tipo de sintaxis con dos barras:${parameter/pat/string}

Cuando hago eco de esta variable en bash, me sale bash:)

Finalmente, no tengo la autorización para compartir el script. Permítanme decir que la variable se llama SOFT="${0##*/}"y se usa en una printfdeclaración"Error message sent by $SOFT"

bela83
fuente

Respuestas:

12

Esto corta todos los elementos de ruta anteriores, tal como basename $0lo haría. La ##trata de encontrar la expansión coincidencia más larga del patrón de prefijo:

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

Desde la página del 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.  

La razón para usarlo ${0##*/}es que no involucra una llamada a un programa externo, pero está ocultando lo que está sucediendo.

Anthon
fuente
Solo por curiosidad, ¿cómo conseguiste la página del manual para esto?
Psycho Punch
¿Has probado man bashy luego buscado parameter##?
Anthon
Sí, lo hice man bashpero tonto, lo busqué, ${así que no pude encontrar alguna coincidencia. Gracias.
Psycho Punch