BASH سه نوع مختلف از انطباق الگو را ارائه میکند. انطباق الگو در پوسته، دونقش ایفا میکند: انتخاب نام فایلها درون یک دایرکتوری ، یا تعیین آنکه آیا یک رشته با یک قالب دلخواه مطابقت مینماید.
در خط فرمان شما غالباً از جانشینها(globs) استفاده میکنید. جانشینها به طور مساعدی شکل ساده الگوها هستند، که میتوانند به آسانی برای انطباق با گروهی از فایلها به کار بروند، یا متغیرها را در برابر قواعد ساده بررسی کنند.
دومین نوع انطباق الگوها، globهای توسعه یافته را در بر میگیرند، که نسبت به جانشینهای معمولی، کاربرد عبارتهای پیچیدهتری را اجازه میدهند.
پس از نگارش
الگو: الگو یک رشته طراحی شده با یک ساختار ویژه برای انطباق با نام فایلها، یا کنترل، دستهبندی، یا معتبرسازی رشتهها است.
جانشینها(globs) اگر فقط برای راحتی باور نکردنیشان باشد هم، مفهوم بسیار مهمی در BASH میباشند. درک صحیح globها به طُرق بسیاری برای شما مفید خواهد بود. جانشینها اساساً الگوهایی میباشند که میتوانند برای انطباق با نام فایلها یا سایر رشتهها به کار بروند.
جانشینها مرکب از کاراکترهای معمولی و فوق کاراکترها هستند. فوق کاراکترها، آن کاراکترهایی هستند که معنی ویژهای دارند. فوق کاراکترهای اصلی عباتند از:
جانشینها به طور صریح از هر دو طرف مهار میگردند. این به آن معناست که یک جانشین بایستی بر تمام رشته( نام فایل یا رشته دادهای) منطبق شود.
در اینجا مثالی در مورد اینکه چگونه میتوانیم از الگوهای جانشین برای بسط نام فایلها استفاده کنیم:
$ lsa abc b c $ echo* a abc b c $ echoa * a abc
BASH جانشین را میبیند، به عنوان مثال
BASH بسط نام فایل را بعد از تفکیک کلمهای، که قبلاً انجام داده است، اجرا مینماید، بنابراین، نام فایلهای ایجاد شده توسط جانشین، همیشه به طور صحیح به کار خواهد رفت. برای مثال:
$ touch "a b.txt" $ lsa b.txt $ rm* $ ls $
در اینجا،
$ lsa b.txt $for file in`ls`; do rm"$ file ";done rm: cannot remove `a': No such file or directory rm: cannot remove `b.txt': No such file or directory $for file in*; do rm"$ file ";done $ ls $
در اینجا از فرمان
BASH همچنین از یک ویژگی به نام جانشینهای توسعه یافته پشتیبانی میکند. این جانشینها در ماهیت قدرتمندتر هستند، از لحاظ فنی، آنها معادل عبارتهای معمولی هستند، اگر چه ساختار آنها به ظاهر متفاوت با آنچه اکثریت مردم به کار میبرند، باشد. این ویژگی به طور پیشفرض غیر فعال است، لیکن میتواند با دستور shopt، که برای تغییر وضعیت گزینههای پوسته به کار میرود، فعال شود. این دستور کوتهنوشتی از عبارت
$ shopt-s extglob
کلمه list داخل پرانتزها لیستی از جانشینهای معمولی یا توسعه یافته میباشد که با کاراکتر
$ lsnames.txt tokyo.jpg california.bmp $ echo!(* jpg |*bmp )names.txt
در اینجا الگوی جانشین(list) به هر چیزی که بر
علاوه بر بسط نام فایل، از جانشینها میتوان برای بررسی انطباق دادهها با یک قالب مشخص شده نیز استفاده نمود. برای مثال، ممکن است نام فایلی را داده باشیم، و انتظار عملیات متفاوت بر اساس پسوند فایل داشته باشیم:
$filename = "somefile.jpg " $if [[ $ filename = * .jpg ]] ; then > echo "$ filename is a jpeg" >fi somefile.jpg is a jpeg
کلمه کلیدی
سپس،بسط ابرو را داریم. از نظر تکنیکی بسط ابرو در زمره جانشینها نمیباشد، اما مشابه آن است. جانشینها فقط به نام فایلهای حقیقی بسط مییابند، در جایی که بسط ابرو به هر جایگردی از الگو بسط خواهد یافت. در اینجا چگونگی کارکرد آن:
$ echo th{ e,a} nthen than $ echo{ /home/* ,/root} /.* profile/home/axxo/.bash_profile /home/lhunath/.profile /root/.bash_profile /root/.profile $ echo{ 1..9} 1 2 3 4 5 6 7 8 9 $ echo{ 0,1}{ 0..9} 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
تکرار سودمند:
برای به شمار آوردن فایلها همواره باید از جانشینها به جای ls(یا مشابه آن) استفاده کنید. جانشینها همیشه به طور ایمن و با حداقل ریسک ایجاد باگ بسط مییابند.
گاهی ممکن است با نام فایلهای خیلی عجیب روبرو شوید. اکثر اسکریپتها برای هر یک از مواردی که در نتیجه استفاده از آنها ممکن است حاصل شود، بررسی نمیشوند. اجازه ندهید اسکریپت شما نیز یکی از آنها باشد!
در مستندات گنو: Pattern Matching
در پرسش و پاسخهای رایج:
چگونه میتوانم از AND/OR/NOT منطقی در الگو(جانشین) پوسته استفاده کنم؟
جانشین( glob ): یک جانشین رشتهایست که میتواند با نام فایلها یا رشتههای معینی منطبق گردد.
عبارتهای منظم(
BASH از عبارت منظم توسعه یافته (
الگوهای عبارت منظم که برای گرفتن گروهها(پرانتزها)به کار میروند، رشتههای گرفته شدهشان را برای بازیابی بعدی، به متغیر
اجازه دهید، تشریح کنم که regex در BASHچگونه کار میکند:
$langRegex ='(..)_(..)' $if [[ $ langRegexLANG =~ $]] >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 از نگارش
از آن جهت که روش regex مورد استفاده در
برای سازگاری سراسری ( اجتناب از الزام به پوشش کاراکترهای خاص ) از یک متغیر برای ذخیره عبارت منظم خود استفاده کنید، مانند.
همچنین، بخش E14 از Chet Ramey's Bash FAQ، را ملاحظه نمایید.
در مستندات گنو: Regex(3)
در پرسش و پاسخهای رایج:
من میخواهم بدون تکرار n مرتبه
عبارت منظم: یک عبارت منظم، الگوی پبچیدهتری است که میتواند برای انطباق با رشتههای معین به کار برود( اما بر خلاف جانشینها نمیتواند به نام فایلها بسط داده شود ).