आपका कोड वास्तव में बैश 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
स्रोत
2015-04-19 16:37:57
मामले में यह प्रासंगिक है, मैं चल रहा हूँ 'जीएनयू बैश, संस्करण 4.2.8 (1) -release (x86_64-पीसी-linux-gnu)' Natty Narwhal पर: ऑपरेटर की। – splicer