Dados nomes de arquivos como estes:
/the/path/foo.txt
bar.txt
Eu espero conseguir:
foo
bar
Porque é que isto'não funciona?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
Qual'é a maneira correcta de o fazer?
Você não'não precisa chamar o comando externo basename
. Ao invés disso, você poderia usar os seguintes comandos:
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo
Note que esta solução deve funcionar em todos os shells recentes (post 2004) POSIX (por exemplo bash
, dash
, ksh
, etc.).
Fonte: Shell Command Language 2.6.2 Expansão dos Parâmetros
Mais sobre Bash String Manipulations: http://tldp.org/LDP/LG/issue18/bash.html
O basename o comando tem duas invocações diferentes; em uma, você especifica apenas o caminho, neste caso ele lhe dá o último componente, enquanto na outra você também dá um sufixo que ele irá remover. Assim, você pode simplificar seu código de exemplo usando a segunda invocação de basename. Além disso, tenha cuidado para citar corretamente as coisas:
fbname=$(basename "$1" .txt) echo "$fbname"