url=http://www.foo.bar/file.ext; echo ${url##/*}
Saya mengharapkan kode ini untuk dicetak file.ext
, tetapi ia mencetak seluruh URL. Mengapa? Bagaimana saya bisa mengekstrak nama file?
dirname $url
. Atau grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Saya mengharapkan kode ini untuk dicetak file.ext
, tetapi ia mencetak seluruh URL. Mengapa? Bagaimana saya bisa mengekstrak nama file?
dirname $url
. Atau grep -o 'http://[^/]*' <<<$url
.
Jawaban:
Karena kata harus cocok dengan string yang harus dipangkas. Seharusnya terlihat seperti:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Terima kasih derobert, Anda mengarahkan saya ke arah yang benar.
Mengutip halaman 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, […]
/*
tidak cocok dengan awal, karena URL Anda dimulai dengan h
tidak /
.
Cara sepele untuk melakukan apa yang Anda cari (sesuai komentar Anda) adalah echo "$url" | rev | cut -d / -f 1 | rev
. Tapi tentu saja, itu akan memberikan hasil yang menarik untuk URL yang diakhiri dengan garis miring.
Cara lain untuk melakukan apa yang Anda inginkan adalah menggunakan pola */
.
basename
(1) juga berfungsi dengan URL, sehingga Anda bisa melakukannya:
url=http://www.foo.bar/file.ext; basename $url
Lihat juga: Bash Extended Globbing , meskipun dalam hal ini glob yang luas tidak penting.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Keluaran: file.ext