ادامه یادداشت قبل
عبارتهای منظم
عبارتهای منظم(regex) مشابه الگوهای جانشین هستند، اما در BASH نمی توانند برای انطباق با نام فایل به کار بروند. از نگارش 3.0، BASH عملگر =~ در کلمه کلیدی [[ را پشتیبانی میکند. این عملگر رشتهای را که قبل از آن میآید با الگوی regex که بعد از آن میآید، مطابقت میدهد. موقعی که رشته با الگو منطبق گردد، کلمهکلیدی [[ یک کد خروج 0 (true) بر میگرداند. اگر رشته با الگو مطابقت نداشته باشد، یک کد خروج 1 (false) باز گردانده میشود. در صورتیکه ترکیب دستوری الگو معتبر نباشد، [[ از عملیات صرفنطر نموده و یک کد خروج 2 صادر میکند.
BASH از عبارت منظم توسعه یافته (ERE) نیز استفاده میکند. ما در این راهنما regexها را به طور گسترده پوشش نمیدهیم، اما اگر این مفهوم برای شما جالب است، لطفاً به عبارت منظم، یا Extended Regular Expressions مراجعه نمایید.
الگوهای عبارت منظم که برای گرفتن گروهها(پرانتزها)به کار میروند، رشتههای گرفته شدهشان را برای بازیابی بعدی، به متغیر BASH_REMATCH، تخصیص خواهند داد.
اجازه دهید، تشریح کنم که regex در BASHچگونه کار میکند:
$ langRegex='(..)_(..)'
$ if [[ $LANG =~ $langRegex ]]
> then
> echo "Your country code (ISO 3166-1-alpha-2) is ${BASH_REMATCH[2]}."
> echo "Your language code (ISO 639-1) is ${BASH_REMATCH[1]}."
> else
> echo "Your locale was not recognised"
> fi
آگاه باشید که تفکیک کلمه regex در BASH از نگارش 3.1 به 3.2 تغییر کرده است. قبل از نگارش 3.2 محصور نمودن الگوی regex در نقلقول، صحیح بود، که این در نگارش 3.2 تغییر کرده است. پس بنابراین، regex همیشه باید غیر نقلقولی باشد. شما باید هر کاراکتر ویژه را با کاربرد کاراکتر \ محافظت کنید. بهترین روش برای سازگاری همیشگی، قرار دادن regex در یک متغیر و بسط آن متغیر در [[ بدون استفاده از نقلقولها میباشد.
-
تکرار مفید:
از آن جهت که روش regex مورد استفاده در 3.2 در نگارش 3.1 نیز معتبر میباشد، ما قویاً پیشنهاد میکنیم هرگز عبارت منظم خودتان را نقلقولی نکنید. به خاطر داشته باشید که کاراکترهای ویژه را به طور صحیح با کاراکتر گریز پوشش دهید!
-
برای سازگاری سراسری ( اجتناب از الزام به پوشش کاراکترهای خاص ) از یک متغیر برای ذخیره عبارت منظم خود استفاده کنید، مانند. re='^\*( >| *Applying |.*\.diff|.*\.patch)'; [[ $var =~ $re ]] این خیلی آسانتر از آن است که شما فقط ترکیب دستوری ERE را بنویسید و از لزوم پوشش، به همان خوبی اجتناب کنید که با تمام نگارشهای 3.x از BASH سازگار باشد.
همچنین، بخش E14 از Chet Ramey's Bash FAQ، را ملاحظه نمایید.
ادامه دارد ....