bash if with or and negation -


क्यों करता है:

  #! / Bin / bash wtf = false अगर [$ wtf ] || || [! -f filethatexists.whatever] तो "WTF1" फाई गूंज अगर [! -f filethatexists.whatever] तो "WTF2" फाई  

प्रिंट:

WTF1

के बजाय कुछ भी नहीं गूंज? यह विशेष रूप से परेशान है कि दूसरा प्रपत्र अपेक्षा के अनुरूप काम करता है और पहले नहीं।

बुनियादी परीक्षण

  [$ wtf]  

परीक्षण करता है कि बीच में स्ट्रिंग खाली है या नहीं।

चूंकि $ wtf स्ट्रिंग 'झूठी' है, सफलता के लिए परीक्षा सही है या बाहर निकलने की स्थिति 0, क्योंकि 'गलत' खाली स्ट्रिंग के समान नहीं है '' - और इसलिए आपको प्रतिक्रिया के रूप में WTF1 मिलता है।

इसके साथ प्रयास करें:

  wtf = ''  

जैसा कि (और) द्वारा बताया गया है, आप तारों के साथ सावधानी बरतने का अच्छा विचार है जो कि आप परीक्षण कर रहे हैं। दरअसल, मुझे यह कहना चाहिए था कि मैं हमेशा [-n "$ wtf"] या [-z "$ wtf"] का उपयोग करने के लिए परीक्षण करने के लिए चाहता हूं कि क्या कोई चर सेट है, क्योंकि जब मैं शेल सीख रहा था तब एक बार जरूरी था, एक बार एक चौथाई सदी पहले। मैंने बैश एफ़िसिआनाडो के काउंटर स्टोरी देखी है कि आपको इसके बारे में बैश में चिंता करने की जरूरत नहीं है - हालांकि, मुझे लगता है कि कोड यहां एक प्रति-उदाहरण प्रदान करता है, वास्तव में आपको इसके बारे में चिंता करने की ज़रूरत है।

  • दोहरे उद्धरण चिह्नों में परीक्षण किए गए चर को सम्मिलित करें, या
  • (बैश में), [[$ wtf]] < / Code> जो चर विस्तार को नियंत्रित करने का तरीका जानना चाहता है।
  • गैर-खाली या खाली के लिए परीक्षण करने के लिए -n या -z परीक्षणों का उपयोग करें
  • कोड> wtf = "1 -eq 0" [$ wtf] & amp; amp; गूंज "WTF0" [[$ wtf]] & amp; amp; गूंज "WTF1" wtf = "false" [$ wtf] & amp; amp; गूंज "WTF2" [[$ wtf]] & amp; amp; गूंज "WTF3" wtf = "" [$ wtf] & amp; amp; गूंज "डब्ल्यूटीएफ 4" [[$ wtf]] & amp; amp; गूंज "WTF5" wtf = "false" ["$ wtf"] और amp; amp; गूंज "डब्ल्यूटीएफ 6" [["$ wtf"]] & amp; amp; गूंज "WTF7" wtf = "" ["$ wtf"] और amp; amp; गूंज "डब्ल्यूटीएफ 8" [["$ wtf"]] & amp; amp; एशो "डब्ल्यूटीएफ 9"

    यह उत्पन्न करता है:

      डब्ल्यूटीएफ 1 डब्ल्यूटीएफ 2 डब्ल्यूटीएफ 3 डब्ल्यूटीएफ 6 डब्ल्यूटीएफ 7   

    दोनों के साथ bash और ksh ( जैसा कि MacOS X 10.6.4 पर पाया जाता है, जब 'bash testcode.sh' या 'ksh testcode.sh' के साथ चलते हैं)। एक असली बॉर्न खोल (यदि आप अभी भी ऐसी चीज़ पा सकते हैं) डबल-ब्रैकेट ऑपरेशन पर आपत्ति कर सकते हैं - यह ' [[' पर $ PATH < / कोड>।

    आप परीक्षाओं को और अधिक मामले विज्ञापन मतभेदों को कवर करने के लिए बढ़ा सकते हैं।


Comments