2012-10-11 10 views
7

मैं एक ऐसी स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो तर्क के आधारनाम को लेता है, फिर जांच करता है कि उस तर्क में कोई एक्सटेंशन है या नहीं। यदि ऐसा है, तो यह एक्सटेंशन प्रिंट करता है।बैश बेसनाम नाम वाक्य

file=basename $1 
ext=${file%*} 
echo ${file#"$stub"} 
echo $basename $1 

मैं क्या basename का उत्पादन होता है की जाँच करने के लिए अंतिम $ basename गूंज रहा हूँ $ 1:

यहाँ मेरी कोड है।

कुछ परीक्षण से पता चलता है:

testfile.sh one.two 
./testfile: line 2: one.two: command not found 
one.two 

testfile.sh ../tester 
./testfile: line 2: ../tester: No such file or directory 
../tester 

तो न $ basename $ 1 काम कर रहे हैं। मुझे पता है कि यह एक वाक्यविन्यास त्रुटि है, तो क्या कोई यह समझा सकता है कि मैं क्या गलत कर रहा हूं?

संपादित करें:

मैं के साथ अब मेरी समस्या हल कर लिए हैं:

file=$(basename "$1") 
stub=${file%.*} 
echo ${file#"$stub"} 

जो एक basename करने के लिए अपने तर्क कम कर देता है, आप सभी को धन्यवाद।

+0

सही वाक्यविन्यास फ़ाइल = $ (बेसनाम $ 1) है। मैं आपको फ़ाइल = $ {1 ## * /} का उपयोग करने की सलाह दूंगा, जो प्रत्येक '* /' अनुक्रम को हटा देगा। यह बेसनाम कमांड की तुलना में वास्तव में बहुत तेज है, खासकर जब लूप में फ़ाइलों को संसाधित करते हैं। –

उत्तर

12

पहले, अपने वाक्य रचना गलत है:

file=$(basename "$1") 

दूसरा, इस फ़ाइल नाम के (अंतिम) विस्तार पाने के लिए सही अभिव्यक्ति है:

ext=${file##*.} 
+0

पहले भाग के लिए धन्यवाद, मुझे एहसास है कि अब फ़ाइल बेसनाम के आउटपुट के बराबर है, जिससे मदद मिलती है।अब मेरा प्रोग्राम इरादे के रूप में काम नहीं कर रहा है, जिसका अर्थ है कि यह tester.two के बजाय tester.two को आउटपुट कर रहा है। मेरा प्रारंभिक तर्क tester.two है। बेसिनैम को जोड़ने से पहले, मेरी स्क्रिप्ट निष्पादित थी क्योंकि मैंने परीक्षण किया था ../tester, जो कुछ भी आउटपुट नहीं करना चाहिए। – Unknown

8

आप एक चर करने के लिए प्रदान करना चाहते हैं कमांड का आउटपुट, आपको इसे वापस निष्पादित करना होगा, या तो बैक कोट्स के साथ या विशेष ब्रांड्स का उपयोग करके उद्धरण:

file=`basename "$1"` 
file=$(basename "$1") 

एक फ़ाइल नाम का एक्सटेंशन को निकालने के आप

ext=${file#*.} 

इस करना चाहिए, $file का मूल्य प्राप्त तो अवधि के लिए सब कुछ निकाल देंगे (क्यों यह आवश्यक है कि है)। यदि आपके फ़ाइल नाम में अवधि होती है, तो आपको ext=${file##*.} का उपयोग करना चाहिए, जहां ## सबसे छोटी स्ट्रिंग को हटाने के लिए बैश को बताता है जो सबसे छोटी की बजाय मेल खाता है, इसलिए यह पहले की बजाय अंतिम अवधि तक हटा देगा।

आपका echo $basename $1 विचित्र है। यह $basename नामक चर के मान को मुद्रित करने और $1 के मान को मुद्रित करने के लिए बैश को बता रहा है, जो स्क्रिप्ट (या फ़ंक्शन) का पहला तर्क है।

आप कमांड आप निष्पादित करने के लिए कोशिश कर रहे हैं मुद्रित करने के लिए चाहते हैं, तो ऐसा करते हैं:

:

echo basename $1 

आप कमांड के उत्पादन में मुद्रित करने के लिए कोशिश कर रहे हैं, तो आप में से एक कर सकते हैं

echo $(basename "$1") 
echo "$file" 
basename "$1" 

उम्मीद है कि यह मदद करता है =)

संबंधित मुद्दे