Pertama, Anda harus eksplisit tentang apa yang Anda inginkan. Jika Anda tahu string berakhir .rtfdan Anda ingin menghapusnya .rtf, Anda dapat menggunakannya var2=${var%.rtf}. Jika Anda tidak tahu apa sufiks itu tetapi Anda ingin menghapus semuanya dimulai dengan yang terakhir ., maka Anda bisa menggunakannya var2=${var%.*}. Jika Anda hanya ingin menjaga semuanya tetap up to the first ., Anda bisa menggunakannya var2=${var%%.*}. Dua opsi terakhir memiliki hasil yang sama jika hanya ada satu periode, tetapi jika mungkin ada lebih dari satu periode, Anda harus memutuskan mana yang Anda inginkan.
Jika Anda benar-benar ingin selalu menghapus jumlah karakter yang tepat, berikut adalah beberapa opsi.
Anda menentukan bash secara spesifik, jadi kami akan mulai dengan bash builtin. Salah satu yang telah bekerja paling lama adalah sintaks suffix-removal yang sama yang saya gunakan di atas: untuk menghapus empat karakter, gunakan var2=${var%????}. Anda perlu satu tanda tanya per karakter dihapus, jadi ini menjadi sulit untuk panjang substring yang lebih besar.
Sedikit lebih baru adalah substring ekstraksi: var2=${var::${#var}-4}. Di sini Anda dapat meletakkan nomor apa saja 4untuk menghapus sejumlah karakter yang berbeda. ( ${#var}Digantikan oleh panjang string, jadi ini sebenarnya meminta untuk menjaga karakter pertama (panjang - 4).)
Versi bash yang lebih baru (khususnya 4+, yang berarti yang dikirimkan dengan MacOS tidak berfungsi) memungkinkan Anda menyederhanakannya menjadi adil var2=${var::-4}.
Jika Anda tidak benar-benar menggunakan bash tetapi beberapa shell tipe POSIX lainnya, penghapusan suffix akan tetap bekerja, bahkan di dasbor lama biasa (di mana tidak ada yang akan melakukannya). Dalam zsh, mereka semua bekerja tetapi Anda harus menempatkan 0antara titik dua: var2=${var:0:-4}dll di ksh, Anda memerlukan 0 dan juga harus menggunakan eksplisit panjang-4 ekspresi: var2=${var:0:${#var}-4}.
Anda tentu saja dapat menggunakan substitusi perintah untuk melakukannya dengan bantuan program utilitas; ada banyak yang akan berhasil, tetapi sesuatu seperti var2=$(cut -c -4 <<<"$var")mungkin merupakan pilihan terpendek.