निम्न कोड देता है
[: -ge: एकात्मक ऑपरेटर अपेक्षित
कब
i=0
if [ $i -ge 2 ]
then
#some code
fi
क्यों?
निम्न कोड देता है
[: -ge: एकात्मक ऑपरेटर अपेक्षित
कब
i=0
if [ $i -ge 2 ]
then
#some code
fi
क्यों?
जवाबों:
आपकी समस्या इस तथ्य से उत्पन्न होती है, $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
।
आपके पास डिफ़ॉल्ट मान निर्दिष्ट करने का विकल्प है, $i
यदि $i
यह रिक्त है, तो निम्नानुसार है:
if [ "${i:-0}" -ge 2 ] ; then ...
यह मान 0 के बजाय विकल्प होगा $i
है $i
अपरिभाषित है। मैं अभी भी उद्धरणों को बनाए रखता हूं क्योंकि, फिर से, अगर $i
खाली का एक गुच्छा है, तो यह अपरिभाषित के रूप में नहीं गिना जाता है , इसे 0 से बदला नहीं जाएगा, और आप एक बार फिर समस्या में भाग लेंगे।
कृपया पढ़ें इस जब आप समय है। शेल को कई लोगों द्वारा ब्लैक बॉक्स की तरह माना जाता है, लेकिन यह बहुत कम और बहुत ही सरल नियमों के साथ संचालित होता है - एक बार जब आप जानते हैं कि वे नियम क्या हैं (उनमें से एक शेल में कैसे काम करते हैं, जैसा कि ऊपर बताया गया है) शेल करेगा आपके लिए और कोई रहस्य नहीं है।
मुझे अपने 5 सेंट जोड़ने की जरूरत है। मैं देखता हूं कि हर कोई उपयोग करता है [
या[[
, लेकिन यह उल्लेख के लायक है कि वे सिंटैक्स का हिस्सा नहीं हैं।
अंकगणितीय तुलना के लिए, ((...))
इसके बजाय का उपयोग करें ।
((...)) एक अंकगणितीय कमांड है, जो 0 का एग्जिट स्टेटस देता है यदि एक्सप्रेशन नॉनजरो है, या 1 है तो एक्सप्रेशन शून्य है। "लेट" के पर्याय के रूप में भी उपयोग किया जाता है, यदि साइड इफेक्ट्स (असाइनमेंट) की आवश्यकता होती है।
देखें: ArithmeticExpression
स्क्रिप्ट का आपका टुकड़ा सिर्फ महान काम करता है। क्या आप वाकई "i" करने से पहले कुछ और नहीं बता रहे हैं?
एक सामान्य गलती यह भी है कि वर्ग कोष्ठक के पहले और बाद में एक स्थान नहीं छोड़ा जाए।