İlk olarak, ne istediğiniz konusunda açık olmalısınız. Dizenin sona erdiğini .rtf
ve kaldırmak istediğinizi .rtf
biliyorsanız, kullanabilirsiniz var2=${var%.rtf}
. Son ekin ne olduğunu bilmiyor ancak sondan başlayarak her şeyi kaldırmak .
istiyorsanız, kullanabilirsiniz var2=${var%.*}
. Her şeyi sadece birincisine kadar tutmak .
istiyorsanız kullanabilirsiniz var2=${var%%.*}
. Yalnızca bir nokta varsa, bu son iki seçenek aynı sonucu verir, ancak birden fazla varsa, hangisini istediğinize karar vermelisiniz.
Tam olarak her zaman tam sayıda karakteri kaldırmak istiyorsanız, bazı seçenekler aşağıda verilmiştir.
Özellikle bash'ı belirttiniz, bu yüzden bash yerleşikleriyle başlayalım. En uzun süre çalışan, yukarıda kullandığım son ek kaldırma sözdizimidir: dört karakteri kaldırmak için kullanın var2=${var%????}
. Kaldırılan karakter başına bir soru işaretine ihtiyacınız vardır, bu nedenle daha büyük alt dize uzunlukları için kullanılmaz.
Biraz daha yeni çıkarma substring edilir: var2=${var::${#var}-4}
. Burada, 4
farklı sayıda karakteri kaldırmak için yerine herhangi bir sayı koyabilirsiniz . (Bunun ${#var}
yerine dize uzunluğu konur, bu nedenle bu aslında ilk (uzunluk - 4) karakteri korumayı ister.)
Yeni bash sürümleri (özellikle 4+, bu da MacOS ile birlikte gelenin çalışmadığı anlamına gelir) bunu basitleştirmenizi sağlar var2=${var::-4}
.
Gerçekten bash kullanmıyorsanız, ancak başka bir POSIX tipi kabuk kullanıyorsanız, sonek kaldırma, düz eski çizgide bile (geri kalanların hiçbirinin olmayacağı) bile çalışmaya devam edecektir. Zsh'de hepsi çalışır, ancak 0
iki nokta üst üste arasına bir sütun koymak var2=${var:0:-4}
zorundasınız var2=${var:0:${#var}-4}
.
Tabii ki bunu bir yardımcı program yardımıyla yapmak için komut yerine kullanabilirsiniz; işe yarayacak çok şey var, ama böyle bir şey var2=$(cut -c -4 <<<"$var")
muhtemelen en kısa seçenektir.