मेरे पास बैश में फ़ाइल परीक्षण अभिव्यक्तियों के बारे में कोई प्रश्न है। ,बैश: फ़ाइल परीक्षण अभिव्यक्ति मूल्यांकन में डबल बनाम एकल ब्रैकेट
- प्रॉम्प्ट पर मैं
foo
दर्ज है, जो एक फ़ाइल है कि निर्देशिका जहाँ से मैं कर रहा हूँ में मौजूद है:set -x read -p "Enter a filename: " var1 if [ - e $var1 ] then echo file exists else echo file not found fi
तीन परिदृश्य हैं: यहाँ मेरे सवाल का वर्णन करने के लिए एक सरल स्क्रिप्ट है स्क्रिप्ट चल रहा है। जैसा कि अपेक्षित है, आउटपुट
file exists
है। - प्रॉम्प्ट पर, मैं
bar
दर्ज करता हूं। निर्देशिका में ऐसी कोई फ़ाइल मौजूद नहीं है जिसमें से मैं स्क्रिप्ट चला रहा हूं। जैसा कि अपेक्षित है, आउटपुटfile not found
है। - प्रॉम्प्ट पर, मैंने
<enter>
को कुछ भी टाइप किए बिना मारा। आश्चर्य की बात है, आउटपुटfile exists
है।
अगर मैं if [[ -e $var1 ]]
, जैसे कि, डबल एकल के बजाय कोष्ठक का उपयोग करें, व्यवहार सही है: भी तीसरे मामले में, मैं file not found
मिलता है।
मैंने यह देखने के लिए फ़ाइल के शीर्ष पर set -x
फंस लिया था। एकल ब्रैकेट के साथ, चर का मूल्यांकन इस प्रकार किया जाता है: '[' -e ']'
। डबल के साथ, इसका मूल्यांकन [[ -e '' ]]
के रूप में किया जाता है। यह दिलचस्प है। अभिव्यक्ति का मूल्यांकन दो मामलों में अलग-अलग क्यों किया जा रहा है?
मैं एक स्पष्टीकरण के लिए आभारी रहूंगा। क्षमा करें अगर मैं स्पष्ट याद कर रहा हूँ। धन्यवाद!
धन्यवाद इग्नेसियो की और अधिक जानकारी प्राप्त कर सकते हैं। आपके उत्तर के आधार पर मैंने कुछ और खोज किया और यह लिंक पाया: [लिंक] (http://mywiki.wooledge.org/BashFAQ/031) जो बहुत समझाया गया। – verbose
ग्रेकैट की साइट अद्भुत है। गंभीर बैश स्क्रिप्ट लेखक के लिए आवश्यक पठन। –
मैं इस दावे से दृढ़ता से असहमत हूं कि [[परीक्षण के पक्ष में उपयोग किया जाना चाहिए, और इसे फिर से वाक्यांशित किया जाएगा: '[[केवल तभी उपयोग किया जाना चाहिए जब आप पूरी तरह से निश्चित हों कि आपकी स्क्रिप्ट को न्यूनतम के तहत कभी भी चलाने की आवश्यकता नहीं होगी खोल। ' –