बश में पूर्णांक की तुलना करें, एकरी ऑपरेटर अपेक्षित है


जवाबों:


295

आपकी समस्या इस तथ्य से उत्पन्न होती है, $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 से बदला नहीं जाएगा, और आप एक बार फिर समस्या में भाग लेंगे।

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


7
वैरिएबल को उद्धृत करने से एक नई त्रुटि बढ़ जाएगी जैसे पूर्णांक अभिव्यक्ति की उम्मीद है
Néstor

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

6

त्रुटि संदेश से देखते हुए i का मान खाली स्ट्रिंग था जब आपने इसे निष्पादित किया था, न कि 0।


6

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

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

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

देखें: ArithmeticExpression


2

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.