2012-06-26 12 views
15

ऐसा लगता है कि यह तुलना ऑपरेटर की तरह है, लेकिन यह वास्तव में क्या करता है उदा। निम्नलिखित कोड (https://github.com/lvv/git-prompt/blob/master/git-prompt.sh#L154 से लिया गया)?"= ~" ऑपरेटर शैल स्क्रिप्ट में क्या करता है?

if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]]; then 
      elipses_marker="…" 
    else 
      elipses_marker="..." 
    fi 

मैं वर्तमान में MinGW के तहत काम करने के लिए git-prompt बनाने के लिए कोशिश कर रहा हूँ, और खोल MinGW के साथ आपूर्ति की इस ऑपरेटर का समर्थन नहीं लगता है:

conditional binary operator expected 
syntax error near `=~' 
`  if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]]; then' 

इस विशिष्ट मामले में मैं बस की जगह ले सकता elipses_marker="…" के साथ संपूर्ण ब्लॉक (जैसा कि मुझे पता है कि मेरा टर्मिनल यूनिकोड का समर्थन करता है), लेकिन यह वास्तव में =~ क्या करता है?

उत्तर

10

यह एक पार्टी-केवल है अंतर्निहित [[ कमांड के अलावा, regexp मिलान कर रहा है। चूंकि इसे पूर्ण स्ट्रिंग का सटीक मिलान नहीं होना चाहिए, इसलिए "अचूक" मिलान को इंगित करने के लिए प्रतीक को घुमाया गया है।

इस मामले में, यदि $LC_CTYPEस्ट्रिंग "यूटीएफ" शामिल है।

अधिक पोर्टेबल संस्करण:

if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux" 
then 
    ... 
else 
    ... 
fi 
+2

बैकटिक्स में grep चलाने की कोई आवश्यकता नहीं है। 'अगर $ LC_TYPE गूंजें grep -Fq UTF && "$ TERM" परीक्षण करें! = लिनक्स; फिर –

+0

पठनीय कोड को प्रोत्साहित करने की कोशिश कर रहा है ... मुझे इसे केवल एक 'टेस्ट' और पहली "अभिव्यक्ति" के आस-पास की पृष्ठभूमि के साथ अधिक सहज ज्ञान मिलता है, जो इसे अभिव्यक्ति की तरह दिखता है। (और grep -q भी एक त्रुटि पर सच होगा) :-) लेकिन मैं सहमत हूं। मेरे पास 'test' का उपयोग अक्सर करने की आदत है, लेकिन मुझे लगता है कि यह एक पाइप' if: ing 'से अधिक पठनीय है। – MattBianco

+0

क्या मतलब है "grep -q एक त्रुटि पर भी सच होगा"? –

2

यह मेल खाता है नियमित अभिव्यक्ति

से http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

#!/bin/bash 

input=$1 


if [[ "$input" =~ "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]] 
#    ^NOTE: Quoting not necessary, as of version 3.2 of Bash. 
# NNN-NN-NNNN (where each N is a digit). 
then 
    echo "Social Security number." 
    # Process SSN. 
else 
    echo "Not a Social Security number!" 
    # Or, ask for corrected input. 
fi 
+2

आप रेगुलर एक्सप्रेशन से बोली (बैश 3.2) के रूप में अगर यह एक regex के बजाय एक शाब्दिक स्ट्रिंग हो जाता है। –

3

रूबी की तरह निम्न उदाहरण को देखें, तो यह मेल खाता है जहां आरएचएस संकार्य एक रेगुलर एक्सप्रेशन है।

6

यह एक नियमित अभिव्यक्ति मिलान है। मुझे लगता है कि आपका बैश संस्करण अभी तक इसका समर्थन नहीं करता है।

इस विशेष मामले में, मैं सरल (और तेजी से) पैटर्न मिलान और इसकी जगह का सुझाव देते हैं:

[[ $LC_CTYPE == *UTF* && $TERM != "linux" ]] 

(ध्यान दें कि * यहाँ उद्धृत नहीं किया जाना चाहिए)

संबंधित मुद्दे