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

پارامترهای ویژه

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


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


پارامترهای خاص و متغیرها

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

 
    $ # Some parameters that aren\'t variables:
    $ echo "My shell is $0, and has these options set: $-"

    My shell is -bash, and has these options set: himB
    $ # Some parameters that ARE variables:
    $ echo "I am $LOGNAME, and I live at $HOME."
    I am lhunath, and I live at /home/lhunath.

لطفاً توجه نمایید: برخلاف PHP و Perl ...پارامترها با علامت $ شروع نمی‌شوند.علامت $ که شما در مثال مشاهده می‌کنید، صرفاً موجب می‌شود که پارامتر ذکر شده بعد از آن، بسط داده شود. بسط اساساً به معنای آنست که پوسته پارامتر را با محتوای آن تعویض می‌کند. به این ترتیب، LOGNAME پارامتری( متغیری ) است که محتوای آن نام کاربری شماست. ‎$LOGNAME‎ عبارتی است که با محتوای آن متغیر تعویض خواهد شد، که در این حالت lhunath است.

گمان می‌کنم حالا، مقصود را دریافته‌اید. در اینجا خلاصه‌ای از اکثر پارامترهای ویژه:

  • 0: محتوی نام یا مسیر اسکریپت است( این در همه حال صدق نمی‌کند. )

  • پارامترهای موضعی(مکانی): 1, 2, 3 ...، اینها محتوی شناسه‌هایی می‌باشند که ما به اسکریپت یا تابع جاری می‌دهیم.

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

  • @: به تمام کلمات پارامترهای موضعی بسط می‌یابد، اگر نقل‌قول دوگانه بشود، به لیستی از تمام کلمات پارامترهای موضعی به صورت کلمه‌های منفرد، بسط می‌یابد.

  • #: به عدد معادل تمام پارامترهای موضعی(مکانی) ارائه شده فعلی، بسط می‌یابد.

  • ?: به کد خروج آخرین فرمان تکمیل شده در پیش‌زمینه، بسط می‌یابد.

  • $: به PID ( شماره ID پردازش) پوسته جاری، بسط می‌یابد.

  • !: به PID آخرین دستور اجرا شده در پس‌زمینه، بسط می‌یابد.

  • _: به آخرین شناسه آخرین فرمانی که اجرا شده است، بسط داده می‌شود.

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

  • BASH_VERSION: محتوی رشته‌ایست که شماره نگارش BASH را شرح می‌دهد.

  • HOSTNAME: شامل نام میزبان کامپیوتر شما می‌باشد، به شکل کوتاه یا بلند، بستگی به چگونگی تنظیمات کامپیوتر شمادارد.

  • PPID: محتوی شماره شناسایی پردازش(PID) پردازش والد پوسته جاری است.

  • PWD: محتوی دایرکتوری کاری جاری است.

  • RANDOM: هرگاه این متغیر را بسط بدهید، یک عدد تصادفی(ساختگی) بین 0 تا 32767 تولید می‌شود.

  • UID:شماره شناسایی(ID) کاربر فعلی . نامعتبر برای مقاصد امنیتی یا تأییدی، افسوس.

  • COLUMNS: تعداد کاراکترهایی که می‌تواند یک سطر از ترمینال شما را پر کند(عرض ترمینال شما بر حسب کاراکتر).

  • LINES: تعداد سطرهایی که ترمینال جاری شما را پر می‌کند(ارتفاع ترمینال بر حسب سطر).

  • HOME: دایرکتوری خانگی کاربر فعلی.

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

  • PS1: شامل رشته‌ایست که اعلان پوسته شما را تشریح می‌کند.

  • TMPDIR: شامل دایرکتوری مورد استفاده پوسته برای نگهداری فایل‌های موقتی آن، می‌باشد.

(خیلی بیشتر از اینها وجود دارد-- برای لیست جامع، مستندات را ملاحظه نمایید.) البته، شما محدود به این متغیرها نمی‌باشید. هرطور که مایلید متغیرهای خودتان را تعریف کنید:

    $ country=Canada

    $ echo "I am $LOGNAME and I currently live in $country."
    I am lhunath and I currently live in Canada.

توجه داشته باشید که ما کمیت Canada را به متغیر country اختصاص دادیم. به یاد داشته باشید که شما مجاز به قرار دادن فاصله، قبل و بعد از علامت تساوی نمی‌باشید!

    $ language = PHP
    -bash: language: command not found
    $ language=PHP

    $ echo "I\'m far too used to $language."
    I\'m far too used to PHP.

به خاطر بیاورید که BASH پرل یا PHP نیست. شما باید خیلی مراقب چگونگی کارکرد بسط، جهت پرهیز از دردسر بزرگ، باشید. اگر این طور عمل نکنید، موقعیت‌های خیلی خطرناکی در اسکریپت‌هایتان خلق می‌کنید، به‌خصوص موقعی که این اشتباه با دستور rm همراه باشد:

    $ ls

    no secret  secret
    $ file=\'no secret\'
    $ rm $file
    rm: cannot remove `no\': No such file or directory

فرض کنید ما دو فایل no secret و secret داریم. اولی محتوی چیز ارزشمندی نیست، اما دومی محتوی اطلاعات سری است، که جهان را از سرنوشت بد(نابودی) رهایی می‌بخشد. ملاحظه کنید که اگر نقل‌قولی کردن بسط پارامتر file را فراموش کنید. BASH پارامتر را بسط می‌دهد ونتیجه آن ‎ rm no secret می‌شود. BASH مطابق معمول شناسه‌ها را نسبت به فضای سفید آنها تفکیک می‌کند، و به فرمان rm دو شناسه تحویل می‌دهد: \'no\' و \'secret\'. درنتیجه موفق به یافتن فایل no نمی‌شود و اما فایل secret را حذف می‌کند. فایل secret از دست می‌رود!


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




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

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


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