url=http://www.foo.bar/file.ext; echo ${url##/*}
이 코드는 을 인쇄할 것으로 예상했는데 file.ext
전체 URL이 인쇄되었습니다. 왜? 파일 이름을 추출하는 방법은 무엇입니까?
답변1
단어가 잘릴 문자열과 일치해야 하기 때문입니다. 다음과 같아야 합니다:
$ url="http://www.foo.bar/file.ext"; echo "${url##*/}"
file.ext
DeRobert에게 감사드립니다. 당신은 저를 올바른 방향으로 이끌었습니다. 또한 @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