الگوهای جانشین(Glob Patterns)
جانشینها(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) : صفر یا یک مورد تطابق با الگوی داده شده.*(list) : هر یا هیچ مورد انطباق با الگوی مورد اشاره.+(list) : یک مورد انطباق با الگو یا بیشتر.@(list) : انطباق با یکی از نمونههای داده شده.!(list) : با هر چیزی غیر از موارد ذکر شده انطباق مییابد.
کلمه 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 ): یک جانشین رشتهایست که میتواند با نام فایلها یا رشتههای معینی منطبق گردد.