अप्रत्याशित विस्तार
ऐसी त्रुटियाँ होना संभव है जो किसी स्क्रिप्ट में केवल रुक-रुक कर होती हैं। कभी-कभी स्क्रिप्ट ठीक चलेगी और कभी-कभी विस्तार के परिणामों के कारण विफल हो जाएगी। यदि हम अपने लुप्त अर्धविराम को वापस कर देते हैं और का मान बदल देते हैं संख्या एक खाली चर के लिए, हम
प्रदर्शित कर सकते हैं:
#! / Bin / bash
# परेशानी: सामान्य त्रुटियों को प्रदर्शित करने के लिए स्क्रिप्ट
संख्या=
यदि [$संख्या = 1 ]; तब
प्रतिध्वनि "संख्या 1 के बराबर है।" अन्य
प्रतिध्वनि "संख्या 1 के बराबर नहीं है।"
fi
#! / Bin / bash
# परेशानी: सामान्य त्रुटियों को प्रदर्शित करने के लिए स्क्रिप्ट
संख्या=
यदि [$संख्या = 1 ]; तब
प्रतिध्वनि "संख्या 1 के बराबर है।" अन्य
प्रतिध्वनि "संख्या 1 के बराबर नहीं है।"
fi
इस परिवर्तन के साथ स्क्रिप्ट चलाने से आउटपुट प्राप्त होता है:
[मुझे@लिनक्सबॉक्स ~]$ मुसीबत
/होम/मी/बिन/ट्रबल: लाइन 7: [: =: यूनरी ऑपरेटर अपेक्षित संख्या 1 के बराबर नहीं है।
[मुझे@लिनक्सबॉक्स ~]$ मुसीबत
/होम/मी/बिन/ट्रबल: लाइन 7: [: =: यूनरी ऑपरेटर अपेक्षित संख्या 1 के बराबर नहीं है।
हमें यह गुप्त त्रुटि संदेश मिलता है, जिसके बाद दूसरा आउटपुट आता है गूंज आज्ञा। समस्या का विस्तार है संख्या चर के भीतर परीक्षण आज्ञा। जब आदेश:
[$संख्या = 1 ]
[$संख्या = 1 ]
के साथ विस्तार होता है संख्या खाली होने पर, परिणाम यह है:
[=1 ]
[=1 ]
जो अमान्य है और त्रुटि उत्पन्न होती है. = ऑपरेटर एक बाइनरी ऑपरेटर है (इसके लिए प्रत्येक पक्ष पर एक मान की आवश्यकता होती है), लेकिन पहला मान गायब है, इसलिए परीक्षण कमांड एक यूनरी ऑपरेटर की अपेक्षा करता है (जैसे -z) बजाय। इसके अलावा, के बाद से परीक्षण विफल (त्रुटि के कारण), if कमांड एक गैर-शून्य निकास कोड प्राप्त करता है और तदनुसार कार्य करता है, और दूसरा गूंज आदेश निष्पादित किया जाता है।
पहले तर्क के चारों ओर उद्धरण जोड़कर इस समस्या को ठीक किया जा सकता है परीक्षण
आदेश:
["$संख्या" = 1 ]
["$संख्या" = 1 ]
फिर जब विस्तार होगा तो परिणाम यह होगा:
[ "" = 1 ]
[ "" = 1 ]
जो तर्कों की सही संख्या उत्पन्न करता है। खाली स्ट्रिंग्स के अलावा, उद्धरण चिह्नों का उपयोग उन मामलों में किया जाना चाहिए जहां एक मान बहु-शब्द स्ट्रिंग्स में विस्तारित हो सकता है, जैसे एम्बेडेड रिक्त स्थान वाले फ़ाइल नामों के साथ।