El comando basename tiene dos invocaciones diferentes; en uno, especifica solo la ruta, en cuyo caso le da el último componente, mientras que en el otro también le da un sufijo que eliminará. Por lo tanto, puede simplificar su código de ejemplo utilizando la segunda invocación de basename. Además, tenga cuidado de citar correctamente las cosas:
fbname=$(basename "$1" .txt) echo "$fbname"
Aquí hay frases breves:
$(basename "${s%.*}")
$(basename "${s}" ".${s##*.}")
Necesitaba esto, lo mismo que pidieron bongbang y w4etwetewtwet.
No tienes que llamar al basename
externo dominio. En su lugar, podría usar los siguientes comandos:
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
Tenga en cuenta que esta solución debería funcionar en todos los modelos recientes (posteriores a 2004 ) POSIX shells compatibles (por ejemplo, bash
, dash
, ksh
, etc.).
Fuente:Shell Command Language 2.6.2 Expansión de parámetros
Más información sobre manipulaciones de cadenas bash:http://tldp.org/LDP/LG/issue18/bash.html
Una combinación de nombre base y corte funciona bien, incluso en el caso de terminación doble como .tar.gz
:
fbname=$(basename "$fullfile" | cut -d. -f1)
Sería interesante si esta solución necesitara menos potencia aritmética que la expansión de parámetros de Bash.