Porque a palavra precisa corresponder à string a ser aparada. Deveria se parecer com:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Obrigado derobert, você me guiou na direção certa.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Eu esperava que esse código imprimisse file.ext
, mas imprime a URL inteira. Por quê? Como posso extrair o nome do arquivo?
Para citar a página do 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, […]
/*
não corresponde ao início porque seu URL começa com h
não /
.
Uma maneira trivial de fazer o que você está procurando (de acordo com seu comentário) é echo "$url" | rev | cut -d / -f 1 | rev
. Mas é claro, isso dará resultados interessantes para os URLs que terminam em uma barra.
Outra maneira de fazer o que você deseja é usar o padrão */
.
Veja também: Bash Extended Globbing , embora neste caso o glob estendido não seja essencial.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Saída: file.ext
basename
(1) também funciona com URLs, então você pode simplesmente fazer:
url=http://www.foo.bar/file.ext; basename $url