2011-07-12 14 views
5

निम्न बैश स्क्रिप्ट केवल variable worked प्रिंट क्यों करती है?बैश नियमित अभिव्यक्ति परीक्षणों में स्ट्रिंग अक्षर का उपयोग क्यों नहीं किया जा सकता है?

#! /bin/bash 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ 'ba{2}z' ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 

वहाँ बैश प्रलेखन कि राज्यों =~ ऑपरेटर केवल चर, नहीं शाब्दिक साथ काम करता है में कुछ है? क्या यह सीमा किसी अन्य ऑपरेटरों पर लागू होती है?

+0

मामले में यह प्रासंगिक है, मैं चल रहा हूँ 'जीएनयू बैश, संस्करण 4.2.8 (1) -release (x86_64-पीसी-linux-gnu)' Natty Narwhal पर: ऑपरेटर की। – splicer

उत्तर

7

आप अब बैश regex के लिए उद्धरण की जरूरत नहीं है:

#! /bin/bash 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ ba{2}z ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 

# Should output literal worked, then variable worked 

मैं याद नहीं कर सकते, हालांकि जो संस्करण इस बदल दिया है।

1

आपका कोड वास्तव में बैश 3.1 तक अपेक्षित के रूप में काम करता है। लेकिन बैश 3.2 के बाद से पैटर्न मिलान ऑपरेटर का व्यवहार बदल दिया गया है। नवीनतम Bash Manual से उद्धरण:

"पैटर्न के किसी भी हिस्से के लिए मजबूर करने में यह एक स्ट्रिंग के रूप में मिलान किया जा उद्धृत किया जा सकता है।"

और ठीक है कि यहाँ क्या हो रहा है। आप मेटा वर्णों के रूप में {} का उपयोग करना चाहते थे, लेकिन चूंकि आपने उद्धृत किया है कि बैश उन्हें शाब्दिक रूप से व्याख्या करता है। आपके पास दो विकल्प .: है

1.You इस तरह shopt -s compat31 साथ 3.1 संगतता मोड चालू कर सकते हैं:

#!/bin/bash 
shopt -s compat31 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ 'ba{2}z' ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 

2.You कर सकते हैं बंदरगाह अपने कोड दाहिने हाथ की ओर से कोटेशन को हटाने के द्वारा,

#!/bin/bash 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ ba{2}z ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 
संबंधित मुद्दे