2012-08-21 13 views
5

पर इसका उत्तर दिया जा सकता है लेकिन मैं इसे किसी भी तरह से पूछने जा रहा हूं।"[]" बनाम "[[]]" बैश खोल

#!/bin/sh 
export tDay=$(date '+%Y%m%d') 
newfile="filename_$tDay" 
filename="filename_20120821100002.csv" 
echo $newfile $filename 
if [ $filename = *$newfile* ] 
then 
    echo "Matched" 
else 
    echo "Not Matched!" 
fi 

Output: 
$ ./comp.sh 
filename_20120821 filename_20120821100002.csv 
Not Matched! 

और

#!/bin/sh 
export tDay=$(date '+%Y%m%d') 
newfile="filename_$tDay" 
filename="filename_20120821100002.csv" 
echo $newfile $filename 
if [[ $filename = *$newfile* ]] 
then 
    echo "Matched" 
else 
    echo "Not Matched!" 
fi 

$ comp.sh 
filename_20120821 filename_20120821100002.csv 
Matched 

कोई मुझे क्यों फर्क समझा सकते हैं - मैं एक स्क्रिप्ट (comp.sh) के दो संस्करण हैं?

इसके अलावा - किस परिस्थितियों में [ ] बनाम [[ ]] और इसके विपरीत उपयोग किया जाना चाहिए?

+5

यह प्रश्न समान है और इसका एक अच्छा जवाब है जो महान दस्तावेज को इंगित करता है: http://stackoverflow.com/questions/669452/is-preferable-over-in-bash-scripts – malvim

उत्तर

4

test की स्ट्रिंग समानता ऑपरेटर ग्लोब नहीं करता है।

$ [ abc = *bc ] ; echo $? 
1 
$ [[ abc = *bc ]] ; echo $? 
0 
+1

मैं इसे देख सकता हूं। लेकिन क्यों, आप विस्तारित कर सकते हैं क्यों '[] 'बनाम' [[]] 'अंतर बनाता है? – Annjawn

+1

नहीं, मैं नहीं कर सकता। ऐसी कई चीजें हैं जो ज्यादातर लोगों को नहीं पता, सिर्फ इसलिए कि निर्णय लेने की प्रक्रिया जो उन चीजों को लाती थी वह अपारदर्शी थी। –

+0

ठीक है, तो '[]' स्पष्ट रूप से एक कार्यक्रम 'परीक्षण' था (है)? – Annjawn

2

Also - under what circumstances should [ ] be used vs. [[ ]] and vice versa?

यह निर्भर करता है। यदि आप पोर्टेबिलिटी की परवाह करते हैं और अपनी शैल स्क्रिप्ट को विभिन्न प्रकार के गोले पर चलाना चाहते हैं, तो आपको कभी भी [[ का उपयोग नहीं करना चाहिए। यदि आप कुछ गोले पर [[ द्वारा प्रदान की गई सुविधाएं चाहते हैं, तो आपको [[ का उपयोग करना चाहिए जब आप उन सुविधाओं को चाहते हैं। व्यक्तिगत रूप से, मैं कभी भी [[ का उपयोग नहीं करता क्योंकि पोर्टेबिलिटी मेरे लिए महत्वपूर्ण है।

+0

लेकिन मान लें कि मैं '[[]]' का उपयोग नहीं करना चाहता हूं, लेकिन उपरोक्त मेरे कोड में तुलनात्मक तुलना करना भी चाहता हूं, मैंने यह कैसे किया? – Annjawn

+0

क्या आप 'if echo "$ filename की तलाश में हैं" | grep -qF "$ newfile"; फिर ... '? –

+0

ऐसा कुछ लेकिन बिना 'grep' के। इसलिए यदि मैं इसे समझता हूं, तो मेरा कोड एकाधिक शैल प्रकारों पर संगत बनाने का एकमात्र तरीका है और '[['' का उपयोग करने से बचें। – Annjawn

12

[[ एक बैश अंतर्निहित है, और इसका उपयोग #!/bin/sh स्क्रिप्ट में नहीं किया जा सकता है। [[ की क्षमताओं को जानने के लिए आप बैश मैनुअल के Conditional Commands अनुभाग को पढ़ना चाहेंगे। प्रमुख लाभ यह है कि मन को वसंत:

  • == और != पैटर्न मिलान करते हैं, तो दाएँ हाथ की ओर एक ग्लोब पैटर्न
  • =~ और !~ प्रदर्शन नियमित अभिव्यक्ति मिलान हो सकता है। कैप्चर किए गए समूह BASH_REMATCH सरणी में संग्रहीत किए जाते हैं।
  • बूलियन ऑपरेटरों && और ||
  • कोई शब्द बंटवारे, तो यह आपके चर उद्धृत करने के लिए आवश्यक सख्ती से नहीं है।

प्रमुख दोष: आपकी स्क्रिप्ट अब बैश-विशिष्ट है।

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