آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

Glob Patterns

ادامه یادداشت قبل


الگوهای جانشین(Glob Patterns)

جانشین‌ها(globs) اگر فقط برای راحتی باور نکردنی‌شان باشد هم، مفهوم بسیار مهمی در BASH می‌باشند. درک صحیح globها به طُرق بسیاری برای شما مفید خواهد بود. جانشین‌ها اساساً الگوهایی می‌باشند که می‌توانند برای انطباق با نام فایلها یا سایر رشته‌ها به کار بروند.

جانشین‌ها مرکب از کاراکترهای معمولی و فوق کاراکترها هستند. فوق کاراکترها، آن کاراکترهایی هستند که معنی ویژه‌ای دارند. فوق کاراکترهای اصلی عباتند از:

  • *: بر هر رشته‌ای ازجمله رشته تهی منطبق می‌گردد.

  • ?: بر یک کاراکتر منفرد منطبق می‌شود.

  • [...]: بر هر یک از کاراکترهای محصور در کروشه‌ها منطبق می‌شود.

جانشین‌ها به طور صریح از هر دو طرف مهار می‌گردند. این به آن معناست که یک جانشین بایستی بر تمام رشته( نام فایل یا رشته داده‌ای) منطبق شود. ‎a*‎ با رشته ‎cat منطبق نیست، به علت آنکه فقط بر at، منطبق می‌شود، نه بر تمام رشته. در حالیکه، یک جانشین ca*‎، با رشته cat منطبق می‌گردد.

در اینجا مثالی در مورد اینکه چگونه می‌توانیم از الگوهای جانشین برای بسط نام فایلها استفاده کنیم:

    $ ls
    a  abc  b  c
    $ echo *
    a abc b c
    $ echo a*
    a abc

BASH جانشین را می‌بیند، به عنوان مثال ‎a*‎ را، واین جانشین را از طریق نگاه کردن به دایرکتوری جاری و مطابقت glob با تمام فایلهای موجود در آن، بسط می‌دهد. هر نام فایلی که با الگوی جانشین مطابقت داشته باشد، به شمار آمده و به جای جانشین به کار می‌رود. در نتیجه جمله ‎echo a*‎ با جمله ‎echo a abc‎ تعویض شده و بعد اجرا گردیده است.

BASH بسط نام فایل را بعد از تفکیک کلمه‌ای، که قبلاً انجام داده است، اجرا می‌نماید، بنابراین، نام فایل‌های ایجاد شده توسط جانشین، همیشه به طور صحیح به کار خواهد رفت. برای مثال:

    $ touch "a b.txt"
    $ ls
    a b.txt
    $ rm *
    $ ls
    $

در اینجا، * به نام یک فایل منفرد ‎ "a b.txt"‎ بسط یافته. این نام فایل به عنوان یک شناسه منفرد به فرمان rm تحویل می‌گردد. مهم است که بدانیم کاربرد جانشین‌ها برای به شمار آوردن نام فایلها همواره از ایده به کارگیری دستور `ls` برای این متظور، بهتر هستند. در اینجا مثالی می‌آوریم با ترکیب پیچیده‌تری که بعداً آنرا پوشش خواهیم داد، اما دلیل مطلب فوق را خیلی خوب تشریح می‌کند:

    $ ls
    a 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
    $

در اینجا از فرمان for برای پوشش دادن تمام خروجی دستور ls استفاده کرده‌ایم. دستور ls رشته a b.txt را به خروجی می‌دهد. دستور for آن رشته را به کلمات تفکیک می‌کند و به تعداد آن کلمات تکرار را انجام می‌دهد. در نتیجه، for ابتدا برای a، و بعد هم برای b.txt تکرار می‌شود. بدیهی است، این، آنچه ما می‌خواهیم نیست. در حالیکه، glob، به شکل صحیح بسط می‌یابد. و فایل "a b.txt" را نتیجه می‌دهد، که فرمان for آن را به عنوان یک شناسه منفرد دریافت می‌کند.

BASH همچنین از یک ویژگی به نام جانشین‌های توسعه یافته پشتیبانی می‌کند. این جانشین‌ها در ماهیت قدرتمندتر هستند، از لحاظ فنی، آنها معادل عبارتهای معمولی هستند، اگر چه ساختار آنها به ظاهر متفاوت با آنچه اکثریت مردم به کار می‌برند، باشد. این ویژگی به طور پیش‌فرض غیر فعال است، لیکن می‌تواند با دستور shopt، که برای تغییر وضعیت گزینه‌های پوسته به کار می‌رود، فعال شود. این دستور کوته‌نوشتی از عبارت shell options می‌باشد:

    $ shopt -s extglob
  • ‎?(list)‎: صفر یا یک مورد تطابق با الگوی داده شده.

  • ‎*(list)‎: هر یا هیچ مورد انطباق با الگوی مورد اشاره.

  • ‎+(list)‎: یک مورد انطباق با الگو یا بیشتر.

  • ‎@(list)‎: انطباق با یکی از نمونه‌های داده شده.

  • ‎!(list)‎: با هر چیزی غیر از موارد ذکر شده انطباق می‌یابد.

کلمه list داخل پرانتزها لیستی از جانشین‌های معمولی یا توسعه یافته می‌باشد که با کاراکتر | از یکدیگر جدا شده‌اند. این هم یک مثال:

    $ ls
    names.txt  tokyo.jpg  california.bmp
    $ echo !(*jpg|*bmp)
    names.txt

در اینجا الگوی جانشین(list) به هر چیزی که بر ‎*jpg‎ یا ‎*bmp‎ منطبق نمی‌شود بسط داده می‌شود. فقط فایلهای متن همان طور که بسط یافته‌اند به دستور تحویل شده‌اند.

علاوه بر بسط نام فایل، از جانشین‌ها می‌توان برای بررسی انطباق داده‌ها با یک قالب مشخص شده نیز استفاده نمود. برای مثال، ممکن است نام فایلی را داده باشیم، و انتظار عملیات متفاوت بر اساس پسوند فایل داشته باشیم:

    $ filename="somefile.jpg"
    $ if [[ $filename = *.jpg ]]; then
    > echo "$filename is a jpeg"
    > fi
    somefile.jpg is a jpeg

کلمه کلیدی ‎[[‎ و دستور داخلی case ( که بعداً با تفصیل بیشتری شرح داده می‌شوند ) هر دو فرصت بررسی یک رشته در برابر جانشین معمولی --و یا جانشین توسعه یافته در صورتی‌که فعال شده باشد-- را فراهم می‌کنند.

سپس،بسط ابرو را داریم. از نظر تکنیکی بسط ابرو در زمره جانشین‌ها نمی‌باشد، اما مشابه آن است. جانشین‌ها فقط به نام فایلهای حقیقی بسط می‌یابند، در جایی که بسط ابرو به هر جایگردی از الگو بسط خواهد یافت. در اینجا چگونگی کارکرد آن:

    $ echo th{e,a}n
    then 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(یا مشابه آن) استفاده کنید. جانشین‌ها همیشه به طور ایمن و با حداقل ریسک ایجاد باگ بسط می‌یابند.
    گاهی ممکن است با نام فایلهای خیلی عجیب روبرو شوید. اکثر اسکریپت‌ها برای هر یک از مواردی که در نتیجه استفاده از آنها ممکن است حاصل شود، بررسی نمی‌شوند. اجازه ندهید اسکریپت شما نیز یکی از آنها باشد!




  • جانشین( glob ): یک جانشین رشته‌ایست که می‌تواند با نام فایلها یا رشته‌های معینی منطبق گردد.


ادامه دارد ....
نظرات 0 + ارسال نظر
ایمیل شما بعد از ثبت نمایش داده نخواهد شد