url=http://www.foo.bar/file.ext; echo ${url##/*}
我预计这段代码会打印file.ext
,但它打印了整个 URL。为什么?如何提取文件名?
答案1
因为单词必须与要修剪的字符串匹配。它应该看起来像:
$ url="http://www.foo.bar/file.ext"; echo "${url##*/}"
file.ext
谢谢德罗伯特,你引导我走向正确的方向。此外,正如 @frank-zdarsky 提到的,它basename
位于 GNU coreutils 中,并且也应该在大多数平台上可用。
$ basename "http://www.foo.bar/file.ext"
file.ext
答案2
引用联机帮助页:
${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, […]
/*
与开头不匹配,因为您的 URL 以h
not开头/
。
做你正在寻找的事情的一个简单方法(根据你的评论)是echo "$url" | rev | cut -d / -f 1 | rev
。当然,对于以斜线结尾的 URL,这会产生有趣的结果。
做你想做的事情的另一种方法可能是使用模式*/
。
答案3
basename
(1) 也适用于 URL,因此您可以简单地执行以下操作:
url=http://www.foo.bar/file.ext; basename $url
答案4
也可以看看:Bash 扩展通配符,尽管在这种情况下扩展的 glob 不是必需的。
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
输出:file.ext