Variable bash $ {0 ## * /}

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

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

Pero no entiendo lo que / está haciendo aquí. Solo conozco esta sintaxis con dos barras: ${parameter/pat/string}

Cuando repito esta variable en bash, obtengo bash 🙂

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

Respuesta

Esto corta todos los elementos de la ruta anterior, al igual que basename $0 haría. ## intenta encontrar la expansión coincidente 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 usar ${0##*/} es que no implica una llamada a un programa externo, pero oculta lo que está sucediendo.

Comentarios

  • Solo por curiosidad, ¿cómo obtuviste la página de manual para esto?
  • ¿Has probado man bash y luego busqué parameter##?
  • Sí, lo hice man bash pero tonto, busqué ${ por lo que no pudo encontrar una coincidencia. Gracias.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *