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.
man bash
y luego busquéparameter##
?man bash
pero tonto, busqué${
por lo que no pudo encontrar una coincidencia. Gracias.