2012-10-26 18 views
97

मेरे पास बैश वैरिएबल गहराई है और मैं परीक्षण करना चाहता हूं कि यह 0 के बराबर है या नहीं। यदि हां, तो मैं स्क्रिप्ट को निष्पादित करना बंद करना चाहता हूं। अब तक मेरे पास है:बैश स्क्रिप्टिंग - जांचें कि बैश वैरिएबल 0

zero=0; 

if [ $depth -eq $zero ]; then 
    echo "false"; 
    exit; 
fi 

दुर्भाग्य से, इस की ओर जाता है:

[: -eq: unary operator expected 

कृपया, मैं कैसे मेरी स्क्रिप्ट इसे पाने के लिए संशोधित कर सकते हैं (अनुवाद की वजह से थोड़ा गलत हो सकता है) काम कर रहे?

उत्तर

88

ऐसा लगता है कि आपका depth वैरिएबल अनसेट है। इसका अर्थ यह है कि अभिव्यक्ति में चर के मानों को प्रतिस्थापित करने के बाद अभिव्यक्ति [ $depth -eq $zero ][ -eq 0 ] बन जाती है। यहां समस्या यह है कि -eq ऑपरेटर को केवल एक तर्क (शून्य) के साथ ऑपरेटर के रूप में गलत तरीके से उपयोग किया जाता है, लेकिन इसके लिए दो तर्कों की आवश्यकता होती है। यही कारण है कि आप यूनरी ऑपरेटर त्रुटि संदेश प्राप्त करते हैं।

संपादित करें: डॉक्टर जे इस उत्तर के लिए अपने टिप्पणी में आपका उल्लेखके रूप में, एक सुरक्षित तरीका जाँच में सेट किए बिना चर के साथ समस्याओं से बचने के "" में चर संलग्न करने की है। स्पष्टीकरण के लिए उनकी टिप्पणी देखें।

if [ "$depth" -eq "0" ]; then 
    echo "false"; 
    exit; 
fi 

[ कमांड के साथ प्रयोग किया जाता है एक सेट नहीं चर पार्टी की योजना बनाई खाली दिखाई देता है। आप नीचे दिए गए परीक्षण है जो सभी true का मूल्यांकन क्योंकि xyz या तो खाली है या सेट नहीं का उपयोग कर इस की पुष्टि कर सकते हैं:

  • if [ -z ] ; then echo "true"; else echo "false"; fi
  • xyz=""; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
  • unset xyz; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
+1

मैं एक कार्यक्रम से एक परिणाम के रूप में गहराई हो रही है की तरह तुलना ऑपरेटरों का उपयोग कर सकते हैं। मैंने इसे गूंजने की कोशिश की और आउटपुट में कुछ भी नहीं था। हालांकि, जब मैं [[]] का उपयोग करता हूं [जेएसके डोमिनियाक ने सुझाव दिया है, स्क्रिप्ट सही तरीके से काम करती है (वैरिएबल वास्तव में अनसेट होने पर काफी अजीब बात है)। मुझे यह मानना ​​है कि मैं वास्तव में समझ नहीं पा रहा हूं कि क्या हो रहा है ... – Perlnika

+7

आपकी गहराई चर सेट नहीं है। इसका मतलब है कि बैश एक अभिव्यक्ति देखता है जो कहता है '[-eq 0]; तब 'जो इसे समझ में नहीं आता है। '[[]] 'सुरक्षित संस्करण है जो बैश को इसे [[null -eq 0]] के रूप में देखता है जो सही है। – cyon

+3

जांच करने का एक सुरक्षित तरीका दोनों पक्षों को डबल कोट्स में संलग्न करना है, यानी 'अगर ["$ गहराई" -ईक "0"] '; इस तरह, एक अनसेट चर ('$ गहराई') का मूल्यांकन" "(जो निश्चित रूप से शून्य के बराबर नहीं है) –

15

प्रयास करें:

zero=0; 

if [[ $depth -eq $zero ]]; then 
    echo "false"; 
    exit; 
fi 
+0

मैंने काम किया, धन्यवाद !! बीटीडब्ल्यू, डबल के कारण क्या हैं [[ – Perlnika

+2

डबल ब्रैकेट अभिव्यक्ति में एक अलग शब्द के रूप में अनसेट/शून्य चर को संरक्षित करने के बारे में अधिक स्मार्ट हैं। –

+0

@ पावेल, [एक बाश अंतर्निहित है, https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-builtins –

41

डबल parenth एसिस ((...)) अंकगणितीय परिचालनों के लिए प्रयोग किया जाता है।

डबल वर्ग कोष्ठक [[ ... ]] तुलना करने के लिए और जांच संख्या (केवल पूर्णांकों समर्थित हैं), निम्नलिखित ऑपरेटरों के साथ इस्तेमाल किया जा सकता:

· NUM1 -eq NUM2 returns true if NUM1 and NUM2 are numerically equal. 

· NUM1 -ne NUM2 returns true if NUM1 and NUM2 are not numerically equal. 

· NUM1 -gt NUM2 returns true if NUM1 is greater than NUM2. 

· NUM1 -ge NUM2 returns true if NUM1 is greater than or equal to NUM2. 

· NUM1 -lt NUM2 returns true if NUM1 is less than NUM2. 

· NUM1 -le NUM2 returns true if NUM1 is less than or equal to NUM2. 

उदाहरण

if [[ $age > 21 ]] # bad, > is a string comparison operator 

if [ $age > 21 ] # bad, > is a redirection operator 

if [[ $age -gt 21 ]] # okay, but fails if $age is not numeric 

if (($age > 21)) # best, $ on age is optional 
+3

क्या आप कुछ तर्क प्रदान कर सकते हैं/सबूत क्यों कुछ दृष्टिकोण अच्छे हैं और दूसरों को बुरा? – Dennis

+0

@ डेनिस: [यह] (http://tldp.org/LDP/abs/html/comparison-ops.html) उत्तर में बयानों को सत्यापित करने के लिए प्रतीत होता है (-> स्ट्रिंग बनाम पूर्णांक तुलना के लिए अलग-अलग ब्रैकेट) – mozzbozz

+0

'सबसे अच्छा, उम्र पर $ वैकल्पिक है 'यह' $ 'के बिना काम नहीं कर रहा है –

2

आप इस कोशिश कर सकते हैं के लिए:

: ${depth?"Error Message"} ## when your depth variable is not even declared or is unset. 

नोट: यहां यह केवलहैके बाद।

या

: ${depth:?"Error Message"} ## when your depth variable is declared but is null like: "depth=". 

नोट: यहाँ यह :?depth के बाद है।

यहां परिवर्तनीय depthnull पाया गया है यह त्रुटि संदेश प्रिंट करेगा और फिर बाहर निकलें।

1

विशेष रूप से: ((depth))। उदाहरण के लिए, निम्नलिखित प्रिंट 1

declare -i x=0 
((x)) && echo $x 

x=1 
((x)) && echo $x 
6

आप भी इस प्रारूप का उपयोग और '==' '< ='

if (($total == 0)); then 
     echo "No results for ${1}" 
     return 
    fi 
संबंधित मुद्दे