2009-01-03 11 views

उत्तर

1

स्क्रिप्ट का आपका टुकड़ा बस महान काम करता है। क्या आप वाकई "मैं" से पहले कुछ और नहीं सौंप रहे हैं?

एक सामान्य गलती स्क्वायर ब्रैकेट के पहले और उसके बाद एक जगह छोड़ना भी नहीं है।

6

त्रुटि संदेश से आंकना मैं का मान जब आप इसे 0.

242

आपकी समस्या तथ्य $i जब अपने बयान में विफल रहता है एक खाली मूल्य होता है से उत्पन्न होती है निष्पादित, नहीं रिक्त स्ट्रिंग था। हमेशा जब तुलना प्रदर्शन अगर वहाँ थोड़ी सी भी मौका उनमें से एक खाली हो सकता है कि, उदा .:

if [ "$i" -ge 2 ] ; then 
    ... 
fi 

यह कैसे खोल व्यवहार करता है चर की वजह से है है अपने चर बोली। मूल उदाहरण मान लें,

if [ $i -ge 2 ] ; then ... 

पहली बात यह है कि खोल जब कोड के उस विशेष लाइन को क्रियान्वित करता है $i का मूल्य स्थानापन्न, बस अपने पसंदीदा संपादक की खोज & तरह की जगह समारोह होगा है। तो मान लें कि $i खाली है या यहां तक ​​कि अधिक चित्रकारी है, मान लें कि $i रिक्त स्थान का एक गुच्छा है! इस प्रकार खोल $i बदल देगा:

if [  -ge 2 ] ; then ... 

अब जब कि चर प्रतिस्थापन किया जाता है, तुलना के साथ खोल आय और .... विफल रहता है, क्योंकि यह कुछ भी सुगम करने के लिए छोड़ दिया -gt की नहीं देख सकता। हालांकि, के हवाले से $i:

if [ "$i" -ge 2 ] ; then ... 

हो जाता है:

if [ " " -ge 2 ] ; then ... 

खोल अब डबल उद्धरण देखता है, और जानता है कि आप वास्तव में 2 करने के लिए चार कारतूस तुलना कर रहे हैं और if को छोड़ देगा।

if [ "${i:-0}" -ge 2 ] ; then ... 

यह मान 0 $i के बजाय है $i अपरिभाषित है विकल्प होगा:

तुम भी इस प्रकार है, के लिए $i अगर $i खाली है एक डिफ़ॉल्ट मान निर्दिष्ट करने का विकल्प है। मैं अभी भी उद्धरण को बनाए रखने, क्योंकि फिर, अगर $i कारतूस का एक समूह है तो यह रूप में अपरिभाषित गिनती नहीं है, यह 0 के साथ बदल नहीं किया जाएगा, और आप समस्या में एक बार फिर से चलेंगे।

कृपया पढ़ें this जब आप समय है।खोल को कई लोगों द्वारा ब्लैक बॉक्स की तरह माना जाता है, लेकिन यह बहुत कम और बहुत सरल नियमों के साथ काम करता है - एक बार जब आप जानते हैं कि ये नियम क्या हैं (उनमें से एक यह है कि शैल में कैसे चर बदलता है, जैसा कि ऊपर बताया गया है) खोल आपके लिए कोई और रहस्य नहीं है।

+4

चर के हवाले से की तरह ** पूर्णांक उम्मीद अभिव्यक्ति एक नया त्रुटि वृद्धि होगी ** –

+0

@ Néstor ** गलत **, एक चर के हवाले से की तरह * पूर्णांक उम्मीद अभिव्यक्ति एक नया त्रुटि से आगे नहीं बढ़ेगी * यदि चर संख्यात्मक है; एक गैर-संख्यात्मक परिवर्तनीय मान प्रदान करना, चाहे उद्धृत किया गया हो या नहीं, * होगा * परिणाम में त्रुटि होगी। – vladr

+1

मैं उस पल पर कोशिश कर रहा था और मुझे वह त्रुटि मिली। –

6

मुझे अपने 5 सेंट जोड़ने की जरूरत है। मैं देखता हूं कि हर कोई [ या [[ का उपयोग करता है, लेकिन यह उल्लेख करना महत्वपूर्ण है कि वे सिंटैक्स का हिस्सा नहीं हैं।

अंकगणितीय तुलना के लिए, ((...)) का उपयोग करें।

((...)) अंकगणितीय आदेश है, जो 0 के एक बाहर निकलें स्थिति अगर अभिव्यक्ति अशून्य है, या 1 अगर अभिव्यक्ति शून्य है देता है। "चलो" के पर्याय के रूप में का उपयोग भी किया जाता है, यदि साइड इफेक्ट्स (असाइनमेंट) की आवश्यकता होती है।

देखें: ArithmeticExpression