2012-04-28 7 views
6

मेरे पास बैश में फ़ाइल परीक्षण अभिव्यक्तियों के बारे में कोई प्रश्न है। ,बैश: फ़ाइल परीक्षण अभिव्यक्ति मूल्यांकन में डबल बनाम एकल ब्रैकेट

  1. प्रॉम्प्ट पर मैं foo दर्ज है, जो एक फ़ाइल है कि निर्देशिका जहाँ से मैं कर रहा हूँ में मौजूद है:

    set -x 
    read -p "Enter a filename: " var1 
    if [ - e $var1 ] 
    then 
        echo file exists 
    else 
        echo file not found 
    fi 
    

    तीन परिदृश्य हैं: यहाँ मेरे सवाल का वर्णन करने के लिए एक सरल स्क्रिप्ट है स्क्रिप्ट चल रहा है। जैसा कि अपेक्षित है, आउटपुट file exists है।

  2. प्रॉम्प्ट पर, मैं bar दर्ज करता हूं। निर्देशिका में ऐसी कोई फ़ाइल मौजूद नहीं है जिसमें से मैं स्क्रिप्ट चला रहा हूं। जैसा कि अपेक्षित है, आउटपुट file not found है।
  3. प्रॉम्प्ट पर, मैंने <enter> को कुछ भी टाइप किए बिना मारा। आश्चर्य की बात है, आउटपुट file exists है।

अगर मैं if [[ -e $var1 ]], जैसे कि, डबल एकल के बजाय कोष्ठक का उपयोग करें, व्यवहार सही है: भी तीसरे मामले में, मैं file not found मिलता है।

मैंने यह देखने के लिए फ़ाइल के शीर्ष पर set -x फंस लिया था। एकल ब्रैकेट के साथ, चर का मूल्यांकन इस प्रकार किया जाता है: '[' -e ']'। डबल के साथ, इसका मूल्यांकन [[ -e '' ]] के रूप में किया जाता है। यह दिलचस्प है। अभिव्यक्ति का मूल्यांकन दो मामलों में अलग-अलग क्यों किया जा रहा है?

मैं एक स्पष्टीकरण के लिए आभारी रहूंगा। क्षमा करें अगर मैं स्पष्ट याद कर रहा हूँ। धन्यवाद!

उत्तर

3

क्योंकि वे इस तरह काम करते हैं। [[test से अधिक स्मार्ट है, और इसका उपयोग किया जाना चाहिए, सिवाय इसके कि sh के साथ सख्त संगतता आवश्यक है।

+3

धन्यवाद इग्नेसियो की और अधिक जानकारी प्राप्त कर सकते हैं। आपके उत्तर के आधार पर मैंने कुछ और खोज किया और यह लिंक पाया: [लिंक] (http://mywiki.wooledge.org/BashFAQ/031) जो बहुत समझाया गया। – verbose

+1

ग्रेकैट की साइट अद्भुत है। गंभीर बैश स्क्रिप्ट लेखक के लिए आवश्यक पठन। –

+4

मैं इस दावे से दृढ़ता से असहमत हूं कि [[परीक्षण के पक्ष में उपयोग किया जाना चाहिए, और इसे फिर से वाक्यांशित किया जाएगा: '[[केवल तभी उपयोग किया जाना चाहिए जब आप पूरी तरह से निश्चित हों कि आपकी स्क्रिप्ट को न्यूनतम के तहत कभी भी चलाने की आवश्यकता नहीं होगी खोल। ' –

6

परिवर्तन if [ -e "$var1" ] को

आप [] और [[ ]]Here

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