Perintah basename memiliki dua doa yang berbeda; di satu, Anda hanya menentukan jalur, dalam hal ini memberi Anda komponen terakhir, sedangkan di yang lain Anda juga memberikan sufiks yang akan dihapus. Jadi, Anda dapat menyederhanakan kode contoh Anda dengan menggunakan doa kedua dari nama dasar. Juga, berhati-hatilah untuk mengutip hal-hal dengan benar:
fbname=$(basename "$1" .txt) echo "$fbname"
Berikut adalah oneliners:
$(basename "${s%.*}")
$(basename "${s}" ".${s##*.}")
Saya membutuhkan ini, sama seperti yang diminta oleh bongbang dan w4etwetewtwet.
Anda tidak perlu memanggil basename
eksternal memerintah. Sebagai gantinya, Anda dapat menggunakan perintah berikut:
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
Perhatikan bahwa solusi ini harus bekerja di semua (pasca 2004 ) POSIX shell yang sesuai, (mis. bash
, dash
, ksh
, dll.).
Sumber:Bahasa Perintah Shell 2.6.2 Ekspansi Parameter
Lebih lanjut tentang Manipulasi String bash:http://tldp.org/LDP/LG/issue18/bash.html
Kombinasi nama dasar dan cut berfungsi dengan baik, bahkan dalam kasus akhiran ganda seperti .tar.gz
:
fbname=$(basename "$fullfile" | cut -d. -f1)
Akan menarik jika solusi ini membutuhkan daya aritmatika yang lebih sedikit daripada Ekspansi Parameter Bash.