बैश: डबल बराबर -eq


47

मैं बैश में पूर्णांक तुलना कर रहा हूं (यह देखने की कोशिश कर रहा है कि उपयोगकर्ता रूट के रूप में चल रहा है), और मुझे इसे करने के दो अलग-अलग तरीके मिले:

डबल बराबर:

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

मैं समझता हूं कि कोई भी = = या <= बैश में नहीं है, केवल -le और -le है, इसलिए ==यदि कोई है तो वहाँ क्यों है -eq?

क्या दोनों पक्षों की तुलना करने के तरीके में अंतर है?


3
ध्यान दें कि कोष्ठक के अंदर रिक्त स्थान आवश्यक हैं: [ $UID -eq 0 ]नहीं [ $UID -eq 0]
गिल्स एसओ- बुराई को रोकना '

जवाबों:


50

==के लिए एक bashविशिष्ट उपनाम है =, जो -eqसंख्यात्मक तुलना के बजाय एक स्ट्रिंग (लेक्सिकल) तुलना करता है । (यह पर्ल से पीछे की ओर है: शब्द-शैली ऑपरेटर संख्यात्मक हैं, प्रतीकात्मक शब्द शाब्दिक हैं।)


क्या इसका मतलब यह है कि यदि दोनों पक्ष पूर्णांक हैं, तो यह दोनों पक्षों को तार में परिवर्तित करता है और फिर उनकी तुलना करता है?
बीटगैमिट

5
अधिक सटीक रूप से यह चारों ओर का दूसरा तरीका है: सब कुछ एक स्ट्रिंग है, स्ट्रिंग्स को पूर्णांकों के रूप में व्याख्या करने के लिए -eqकहता bashहै ( 0यदि एक स्ट्रिंग सिंक्रनाइज़ किया जाता है तो चेतावनी के बिना उत्पादन )।
जिकॉसर

11
@tjameson एक उदाहरण देने के लिए: [ 01 -eq 1 ]लेकिन [ 01 != 1 ]
गिल्स एसओ- बुराई को रोकना '

3
ध्यान दें कि ऑपरेटर के ==रूप [में गैर-मानक है और इसका उपयोग नहीं किया जाना चाहिए, यह बैश-विशिष्ट नहीं है । यह ksh द्वारा पेश किया गया था और इसे zsh (हालांकि पहले =उद्धृत किए जाने की आवश्यकता है), यश और GNU [उपयोगिता (और कुछ प्रणालियों पर ksh स्क्रिप्ट के रूप में लागू की गई ऐसी कोई उपयोगिता ) द्वारा समर्थित है ।
स्टीफन चेज़लस

@geekosaur को मुझे bash v4.3.42 से एक चेतावनी मिलती है, अगर मेरा तार संख्यात्मक नहीं है: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: hello: पूर्णांक अभिव्यक्ति की उम्मीद है
एंड्रयू बैनब्रिज

13

बोलोवन के उत्तर पर विस्तार से ...

तार के लिए कोई >=या <=तुलना ऑपरेटर नहीं है । लेकिन ((...))पूर्णांक की तुलना करने के लिए आप अंकगणित कमांड के साथ उनका उपयोग कर सकते हैं।

तुम भी (अन्य स्ट्रिंग तुलना ऑपरेटरों का उपयोग कर सकते हैं ==, !=, <, >, लेकिन नहीं =) पूर्णांकों तुलना करने के लिए यदि आप उन्हें अंदर का उपयोग ((...))

उदाहरण

  • दोनों [[ 01 -eq 1 ]]और (( 01 == 1 ))तुलना पूर्णांक है। दोनों सत्य हैं।
  • दोनों [[ 01 == 1 ]]और [ 01 = 1 ]तुलना तुलना करते हैं। दोनों झूठे हैं।
  • दोनों (( 01 -eq 1 ))और (( 01 = 1 ))एक त्रुटि वापस आ जाएगी।

नोट: डबल ब्रैकेट सिंटैक्स [[...]]और डबल कोष्ठक सिंटैक्स ((...))सभी गोले द्वारा समर्थित नहीं हैं।


1
ध्यान दें कि (को छोड़कर mksh/ zshPOSIX मोड में (हालांकि यह एक POSIX सुविधा नहीं है) को छोड़कर)), एक अष्टांग नंबर (दशमलव में 8) के रूप में माना जाएगा (( 010 == 10 ))क्योंकि गलत वापस आ 010जाएगा।
स्टीफन चेजलस

ध्यान दें कि जबकि अधिकांश test/ [कार्यान्वयन की जरूरत नहीं है >=/ <=ऑपरेटरों ( yash's [यद्यपि है), exprहालांकि यह अंकगणित तुलना करना होगा अगर तर्क संख्या (के रूप में पहचाने जाते हैं, इस तरह के ऑपरेटरों है expr 01 '>=' 1सच रिटर्न, expr X01 '>=' X1झूठे रिटर्न)।
स्टीफन चेज़लस

7

यदि आप पूर्णांक तुलना करना चाहते हैं तो आप बेहतर (()) का उपयोग करेंगे, जहाँ आप> = आदि का भी उपयोग कर सकते हैं।

उदाहरण:

if (( $UID == 0 )); then
   echo "You are root"
else
   echo "You are not root"
fi

या (( UID == 0 ))या (( ! UID ))कि मामलों के लिए। ध्यान दें कि ((...))है अमानक (एक kshभी द्वारा समर्थित सुविधा bashऔर zshबदलाव के साथ)।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.