url=http://www.foo.bar/file.ext; echo ${url##/*}
Я ожидал, что этот код напечатает file.ext
, но он печатает весь URL. Почему? Как я могу извлечь имя файла?
dirname $url
. Или grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Я ожидал, что этот код напечатает file.ext
, но он печатает весь URL. Почему? Как я могу извлечь имя файла?
dirname $url
. Или grep -o 'http://[^/]*' <<<$url
.
Ответы:
Потому что слово должно соответствовать строке, которая будет обрезана. Это должно выглядеть так:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Спасибо, Дероберт, ты направил меня в правильном направлении.
Чтобы процитировать manpage:
${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, заканчивающихся косой чертой.
Другой способ сделать то, что вы хотите, это использовать шаблон */
.
basename
(1) также работает с URL, так что вы можете просто сделать:
url=http://www.foo.bar/file.ext; basename $url
Смотрите также: Bash Extended Globbing , хотя в этом случае расширенный glob не является обязательным.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Выход: file.ext