सबसे पहले, आपको स्पष्ट होना चाहिए कि आप क्या चाहते हैं। यदि आप जानते हैं कि स्ट्रिंग समाप्त होती है .rtfऔर आप इसे हटाना चाहते हैं .rtf, तो आप उपयोग कर सकते हैं var2=${var%.rtf}। यदि आपको पता नहीं है कि प्रत्यय क्या है, लेकिन आप आखिरी से शुरू होने वाली हर चीज को हटाना चाहते हैं ., तो आप उपयोग कर सकते हैं var2=${var%.*}। यदि आप केवल सब कुछ पहले तक रखना चाहते हैं ., तो आप उपयोग कर सकते हैं var2=${var%%.*}। पिछले दो विकल्पों का एक ही परिणाम है यदि केवल एक ही अवधि है, लेकिन अगर एक से अधिक हो सकते हैं, तो आपको यह तय करना चाहिए कि आप क्या चाहते हैं।
यदि आप वास्तव में हमेशा सटीक संख्या निकालना चाहते हैं, तो यहां कुछ विकल्प दिए गए हैं।
आपने बैश को विशेष रूप से निर्दिष्ट किया है, इसलिए हम बैश बिल्डिंग्स के साथ शुरू करेंगे। जिसने सबसे लंबे समय तक काम किया है वह वही प्रत्यय-हटाने वाला सिंटैक्स है जिसका मैंने ऊपर उपयोग किया है: चार वर्णों को हटाने के लिए, उपयोग करें var2=${var%????}। आपको हटाए गए चरित्र के प्रति एक प्रश्न चिह्न की आवश्यकता है, इसलिए यह बड़े सबस्ट्रिंग लंबाई के लिए अस्पष्ट है।
थोड़ा नया है घटिया निष्कर्षण var2=${var::${#var}-4}:। यहां आप 4अलग-अलग वर्णों को निकालने के लिए किसी भी संख्या को रख सकते हैं । ( ${#var}इसे स्ट्रिंग की लंबाई से बदल दिया जाता है, इसलिए यह वास्तव में पहला (लंबाई - 4) अक्षर रखने के लिए कह रहा है।)
बैश के नए संस्करण (विशेष रूप से 4+, जिसका अर्थ है कि जो MacOS के साथ काम नहीं करेगा) आपको बस इसे सरल बनाने की अनुमति देता है var2=${var::-4}।
यदि आप वास्तव में बैश का उपयोग नहीं कर रहे हैं, लेकिन कुछ अन्य POSIX- प्रकार शेल, प्रत्यय हटाने अभी भी काम करेंगे, यहां तक कि सादे पुराने डैश में (जहां बाकी कोई भी नहीं होगा)। Zsh में, वे सभी काम करते हैं, लेकिन आपको कॉलोनों के 0बीच रखना होगा : var2=${var:0:-4}आदि। ksh में, आपको 0 की आवश्यकता है और स्पष्ट लंबाई -4 अभिव्यक्ति का उपयोग करना होगा var2=${var:0:${#var}-4}:।
आप बेशक उपयोगिता कार्यक्रम की मदद से इसे करने के लिए कमांड प्रतिस्थापन का उपयोग कर सकते हैं; वहाँ बहुत सारे हैं जो काम करेंगे, लेकिन कुछ ऐसा है जो var2=$(cut -c -4 <<<"$var")शायद सबसे छोटा विकल्प है।