शेल तुलनाओं में एकल और दोहरे समान संकेतों (=) के बीच अंतर क्या है?


28

पढ़ें कि अंदर तार की तुलना ifकरने के लिए हमें डबल वर्ग कोष्ठक का उपयोग करने की आवश्यकता है। कुछ पुस्तकों का कहना है कि तुलना द्वारा किया जा सकता है =। लेकिन यह ==भी साथ काम करता है।

#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
    echo "equal"
fi

क्या तुलना में =और इसके बीच अंतर है ==?


4
क्या यहां कोई सवाल है? यदि हां, तो मैं इसे नहीं देख रहा हूं। =के लिए है [==के लिए है [[
क्रिस डाउन

@ क्रिसडाउन जो बिल्कुल सच नहीं है।
xdavidliu

@xdavidliu देखभाल करने के लिए विस्तृत? यह निश्चित रूप से है POSIX, जिनमें से कोई समझ नहीं है के अनुसार सही ==है, जिसके कारण आप का उपयोग करना चाहिए =साथ (समानता) [, और ==(, पैटर्न मिलान अर्थ विज्ञान कि हवाले से अवगत कर रहे हैं के साथ) के साथ [[help testबनाम देखें help [[
क्रिस डाउन

@ क्रिसडाउन शायद मुझे गलतफहमी है कि "के लिए" का क्या मतलब है। यदि "के लिए" का अर्थ है "केवल साथ काम करता है", तो टिप्पणी सच नहीं है, क्योंकि [ foo == foo ] && echo fooनिश्चित रूप से प्रिंट करता है foo, यह दर्शाता है कि ==साथ काम करता है [। हालांकि, अगर "द्वारा" आप का मतलब है "के साथ इस्तेमाल करने का इरादा था", तो मुझे आपत्ति कम है।
xdavidliu 15

@xdavidliu "आपके द्वारा उल्लेखित विशिष्ट मामले में" पोसिक्स द्वारा परिभाषित "है"। सिर्फ इसलिए कि बैश सुविधा के रूप में यह स्वीकार करने के लिए होता है, इसका मतलब यह नहीं यह अनुशंसा की जाती है - आप पोर्टेबिलिटी वैसे भी छोड़कर कर रहे हैं, बस का उपयोग [[पहली जगह जो tokenisation, शब्द बंटवारे, के एक काफी अधिक सूक्ष्म समझ है में आदि ...
क्रिस डाउन

जवाबों:


28

[[ $a == $b ]]तुलना नहीं है, यह पैटर्न मिलान है। आपको [[ $a == "$b" ]]बाइट-टू-बाइट समानता की तुलना की आवश्यकता है। किसी भी शेल में =समान है ==जो समर्थन करता है [[...]](द्वारा प्रस्तुत ksh)।

[[...]]मानक shवाक्यविन्यास नहीं है । [ आदेश मानक है, और मानक तुलना ऑपरेटर है =(हालांकि कुछ [कार्यान्वयन यह भी मानते हैं ==)।

किसी भी आदेश के किसी भी तर्क की तरह, चर को उद्धृत किया जाना चाहिए, इसलिए:

[ "$a" = "$b" ]

मानक में sh, पैटर्न मिलान इसके साथ किया जाता है case:

case $a in
  ($b) ...
esac

संपूर्णता के लिए, अन्य समानता जैसे ऑपरेटर जो आप शेल स्क्रिप्ट में आ सकते हैं:

  • [ "$a" -eq "$b" ]: [दशमलव पूर्णांक संख्याओं की तुलना करने के लिए मानक ऑपरेटर। कुछ [कार्यान्वयन संख्या के आसपास रिक्त स्थान की अनुमति देते हैं, कुछ मनमाने ढंग से अंकगणितीय अभिव्यक्तियों की अनुमति देते हैं, लेकिन यह पोर्टेबल नहीं है। शायद ही, कोई इसके लिए उपयोग कर सकता [ "$((a))" -eq "$((b))" ]है। यह भी देखें कि [ "$((a == b))" -ne 0 ]कौन सा मानक समतुल्य होगा (उस POSIXly को छोड़कर, व्यवहार केवल तभी निर्दिष्ट किया जाता है जब $aऔर $bपूर्णांक स्थिरांक होते हैं):
  • ((a == b)), Ksh से और भी में पाया zshऔर bash, सच वापस लौट आता है में संग्रहीत अंकगणितीय अभिव्यक्ति के मूल्यांकन $aके रूप में पैदावार एक ही नंबर $b। आमतौर पर, इसका उपयोग संख्याओं की तुलना के लिए किया जाता है। ध्यान दें कि गोले के बीच भिन्नताएं हैं कि अंकगणितीय अभिव्यक्तियों का मूल्यांकन कैसे किया जाता है और कौन सी संख्याओं का समर्थन किया जाता है (उदाहरण के लिए बैश और ksh के कुछ कार्यान्वयन / संस्करण अस्थायी बिंदु का समर्थन नहीं करते हैं या प्रमुख शून्य के साथ संख्याओं का इलाज करते हैं)।

  • expr "$a" = "$b"यदि दोनों ऑपरेंड को दशमलव पूर्णांक संख्या के रूप में मान्यता दी जाती है (कुछ संख्या के आसपास रिक्त स्थान की अनुमति देता है), और अन्यथा जांचता है कि क्या दो स्ट्रिंग ऑपरेटरों के पास एक ही क्रमबद्ध क्रम है। यह उन मूल्यों के लिए भी विफल हो जाएगा $aया जैसे $bकि exprऑपरेटर हैं (, substr...

  • awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b": यदि $aऔर $bसंख्या के रूप में पहचाना जाता है (कम से कम दशमलव पूर्णांक और फ्लोटिंग पॉइंट नंबर जैसे 1.2, -1.5e-4, अग्रणी अनुगामी रिक्तता को अनदेखा किया जाता है, कुछ भी हेक्साडेसिमल, अष्टक या किसी भी चीज से पहचाने जाते हैं strtod()), तो एक संख्यात्मक तुलना की जाती है। अन्यथा, क्रियान्वयन के आधार पर, यह या तो एक बाइट-टू-बाइट स्ट्रिंग तुलना दी गई है, या के लिए की तरह exprएक strcoll()तुलना, कि क्या है $aऔर $bतरह ही।

यह भी देखें:


13

ये बैश में बराबर हैं:

[[ $x == "$y" ]]
[[ $x = "$y" ]]
[ "$x" == "$y" ]
[ "$x" = "$y" ]

पहले दो $ x चर को उद्धृत नहीं किया जाना चाहिए। बैश शब्द बंटवारे और पथनाम विस्तार को अंदर करता है [लेकिन अंदर नहीं []:

$ x='a b'
$ [ -s $x ]
-bash: [: a: binary operator expected
$ [[ -s $x ]]
$ ls
$ [ a = * ]
-bash: [: a: unary operator expected
$ [[ a = * ]]
$ 

[[ $x = "$y" ]]एक स्ट्रिंग तुलना है लेकिन [[ $x = $y ]]एक पैटर्न मिलान अभिव्यक्ति है:

$ y='a*'; [[ aa = "$y" ]]; echo $?
1
$ y='a*'; [[ aa = $y ]]; echo $?
0

-eq केवल पूर्णांकों के साथ उपयोग करने के लिए है:

$ [[ x.x -eq x.x ]]
-bash: [[: x.x: syntax error: invalid arithmetic operator (error token is ".x")
$ x=9; [[ "x" -eq 9 ]]; echo $?
0

BashFAQ / 031 भी देखें : परीक्षण के बीच क्या अंतर है, [और [?]

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