पूर्ण पथ से विस्तार के बिना फ़ाइल नाम कैसे निकालें?


10

मैं अपनी पहली बैश स्क्रिप्ट को सही करने की कोशिश कर रहा हूं, और एक बिंदु पर स्क्रिप्ट के रूप में एक फ़ाइल नाम दिया गया है $1। मुझे एक्सटेंशन के बिना फ़ाइल नाम निकालने की आवश्यकता है।
वर्तमान में, मैं मान रहा हूं कि सभी एक्सटेंशन तीन अक्षर हैं इसलिए मैं फ़ाइल नाम प्राप्त करने के लिए अंतिम 4 वर्ण हटाता हूं:

a="${1:0:-4}"

लेकिन मुझे उन एक्सटेंशन के साथ काम करने में सक्षम होना चाहिए जिनके पास तीन से अधिक वर्ण हैं, जैसे %~n1कि विंडोज में।
क्या तर्कों से विस्तार के बिना फ़ाइल नाम निकालने का कोई तरीका है?


जवाबों:


27

बैश में ऐसा करने का सामान्य तरीका पैरामीटर विस्तार का उपयोग करना है। ( बैश मैन पेज देखें और "पैरामीटर विस्तार" के लिए खोज करें।)

a=${1%.*}

यह %इंगित करता है कि .*संभव से कम से कम मिलान का उपयोग करते हुए दाईं ओर से पैटर्न का मिलान करते हुए सब कुछ , पैरामीटर से हटा दिया जाना है $1। इस स्थिति में, आपको अभिव्यक्ति के चारों ओर दोहरे उद्धरण (") की आवश्यकता नहीं है।


1
फ़ाइल पैटर्न आम तौर पर इस तरह होते हैं: "Some.eng.ext"। स्पष्ट रूप से इस मामले में एक्सटेंस एक्सटेंशन है, लेकिन $ {1%। *} का उपयोग करके केवल "समथिंग" भाग वापस आ जाएगा?
user304822

2
नहीं ${1%.*}लौटेगा Something.eng। आप पहली बार के अधिकार के लिए सब कुछ बंद पट्टी चाहते हैं .सहित ., उपयोग ${1%%.*}, जो वापस आ जाएगी Something
गैरीजोन


0

बेसन का उपयोग किए बिना बैश में वन-लाइनर :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.