منبع اصلی نوشتار زیر در این لینک قرار دارد

بسط پارامتر

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


راهنمای آموزشی  BashGuide   مؤلف  Lhunath


بسط پارامتر

بسط پارامتر اصطلاحی است که به هر عملی اشاره می‌کند که موجب بسط یافتن(تعویض با محتوا) یک پارامتر گردد. در اساسی‌ترین شکل، بسط پارامتر با پیشوند کردن پارامتر توسط یک علامت $ به پارامتر به دست می‌آید. در بعضی موقعیت‌های خاص جفت ابروی اضافی در اطراف نام پارامتر لازم است:

    $ echo "\'$USER\', \'$USERs\', \'${USER}s\'"
    \'lhunath\', \'\', \'lhunaths\'

این مثال شرح می‌دهد که اساس بسط پارامتر(PE) چگونه است. دومین PE به یک رشته تهی منجر می‌شود. به علت آنکه پارامتر USERs تهی است. هدف ما این نبود که s بخشی از نام پارامتر باشد. چون به این طریق BASH نمی‌تواند بداند که شما می‌خواهید یک s لفظی به محتوای پارامتر پیوست کنید، لازم است از ابروها برای علامت گذاری ابتدا و انتهای نام پارامتر استفاده کنید. آنچه که ما در سومین PE در مثال فوق انجام داده‌ایم.

بسط پارامتر همچنین ترفندهایی برای ویرایش رشته‌ای که بسط خواهد یافت، به ما می‌دهد. این عملیات می‌توانند بسیار مناسب باشند:

    $ for file in *.JPG *.jpeg
    > do mv "$file" "${file%.*}.jpg"
    > done

کد بالا می‌تواند برای تغییر نام همه فایل‌های JPEG با پسوند ‎ .JPG‎ یا ‎.jpeg‎ به فایل با پسوندمعمول ‎.jpg‎ استفاده شود. عبارت ‎${file%.*}‎ قسمتی ازانتهایی‌ترین بخش نام فایل که با نقطه(.) شروع شده باشد، را جدا می‌کند. سپس در همان نقل‌قول، پسوند جدید به انتهای نتیجه حاصل از بسط افزوده می‌شود.

در اینجا خلاصه‌ای ازاکثر ترفندهای PE که معتبر هستند آمده است:

  • ${parameter:-word}‎: مقادیر پیش‌فرض استفاده می‌شود. اگر parameter موجود نباشد یا تهی باشد، بسط word جایگزین می‌گردد. در غیر آن‌صورت، مقدار parameter جایگزین می‌گردد.

  • ${parameter:=word}‎: تخصیص مقدار پیش‌فرض. اگر parameter موجود نباشد یا تهی باشد، بسط word به parameter تخصیص داده می‌شود. سپس مقدار parameterجایگزین می‌شود.

  • ${parameter:+word}‎: استفاده از مقدار جایگزین. اگر parameter موجود نباشد یا تهی باشد، چیزی جایگزین نمی‌شود، در غیر آنصورت بسط word جایگزین می‌گردد.

  • ${parameter:offset:length}‎ بسط زیر رشته(قسمتی از رشته). به تعداد length کاراکتر از parameter با شروع ازکاراکتری که محل آن توسط offset تعیین شده(شمارش از صفر است)، بسط می‌یابد. اگر :length از قلم افتاده باشد، تا انتها را شامل می‌شود. اگر offset منفی باشد(از پرانتز استفاده شود!)، به جای شمارش از ابتدای parameter به جلو، از انتها به طرف عقب انجام می‌شود.

  • ${#parameter}‎: تعداد کاراکترهایی به اندازه مقدار parameter جایگزین می‌گردد.

  • ${parameter#pattern}‎: الگوی pattern از ابتدای parameter مطابقت داده می‌شود. نتیجه بسط، جایگزینی باقیمانده parameter پس ار حذف کوتاهترین انطباق با الگو خواهد بود.

  • ${parameter##pattern}‎: مانند مورد فوق، اما با حذف بلندترین مورد انطباق.

  • ${parameter%pattern}‎: الگوی pattern با انتهای ، parameter مطابقت داده می‌شود. نتیجه، زیر رشته‌ای از parameter است که پس از حذف کوتاه‌ترین انطباق حاصل می‌شود.

  • ${parameter%%pattern}‎: مانند مورد فوق، اما بلندترین انطباق حذف می‌گردد.

  • ${parameter/pattern/string}‎: از چپ به راست parameter را جستجو نموده و اولین انطباق pattern را با رشته string تعویض می‌کند.

  • ${parameter//pattern/string}‎: مانند مورد فوق، اماهمه موارد انطباق pattern، تعویض می‌شوند.

با تمرین، همه موارد فوق را یاد می‌گیرید. اینها، اغلب خیلی بیش از آنکه فکر می‌کنید، سودمند خواهند بود. در اینجا چند مثال برای شروع اولیه شما:

 
    $ file="$HOME/.secrets/007"; \\
    > echo "File location: $file"; \\
    > echo "Filename: ${file##*/}"; \\
    > echo "Directory of file: ${file%/*}"; \\
    > echo "Non-secret file: ${file/secrets/not_secret}"; \\
    > echo; \\
    > echo "Other file location: ${other:-There is no other file}"; \\
    > echo "Using file if there is no other file: ${other:=$file}"; \\
    > echo "Other filename: ${other##*/}"; \\
    > echo "Other file location length: ${#other}"
    File location: /home/lhunath/.secrets/007
    Filename: 007
    Directory of file: /home/lhunath/.secrets
    Non-secret file: /home/lhunath/.not_secret/007

    Other file location: There is no other file
    Using file if there is no other file: /home/lhunath/.secrets/007
    Other filename: 007
    Other file location length: 26

تفاوت میان ‎${v#p}‎ و ‎${v##p}‎ را به خاطر بسپارید. دوتایی شدن کاراکتر #به آن معنی است که، الگوها حریص(پر خور) می‌شوند. همین مطلب برای % نیز صادق است:

 
    $ version=1.5.9; echo "MAJOR: ${version%%.*}, MINOR: ${version#*.}."
    MAJOR: 1, MINOR: 5.9.
    $ echo "Dash: ${version/./-}, Dashes: ${version//./-}."
    Dash: 1-5.9, Dashes: 1-5-9.

توجه: نمی‌توانید PEهای چندگانه را با هم به کار ببرید. اگر نیاز به اجرای PEچندگانه روی یک پارامتر دارید، باید از چندین جمله استفاده کنید:
مترجم: ( بسط پارامتر )PE=Parameter Expansion

    $ file=$HOME/image.jpg; file=${file##*/}; echo "${file%.*}"
    image


  • عادت مفید:
    ممکن است برای ویرایش رشته‌ها، به استفاده از برنامه‌های خارجی از قبیل sed و awk و cut و perl یا سایر برنامه‌ها، وسوسه شوید. آگاه باشید که برای اجرای هر یک از این برنامه‌ها، یک پردازش اضافه‌ای باید شروع شود، که در بعضی موارد می‌تواند موجب کندی اجرا بشود. بسط پارامترها یک جایگزین بدون نقص است.




  • بسط پارامتر: هر گونه بسط(تعریف پیشتر را ملاحظه کنید) یک پارامتر. در حین انجام این بسط، عملیات معینی ممکن است روی کمیتی که بسط داده خواهد شد، صورت گیرد.

ادامه دارد ....



به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد