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

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

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

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

توابع

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


توابع

توابع در اسکریپت‌های bash خیلی جذاب هستند. بلوک‌هایی از فرمانها می‌باشند، خیلی مشابه اسکریپت‌های عادی، که شاید شما بنویسید، به جز آنکه به صورت فایلهای جداگانه نیستند. هرچند که، آنها درست مانند اسکریپت‌ها شناسه‌ها را می‌پذیرند -- و بر خلاف اسکریپت‌ها، اگر شما بخواهید، می‌توانند بر متغیرهای داخل اسکریپت‌های شما تأثیرگذار باشند. برای مثال این مورد را ملاحظه کنید:

    $ sum() {
    >   echo "$1 + $2 = $(($1 + $2))"
    > }

این نمونه وقتی اجرا شود، مطلقاً کاری انجام نمی‌دهد. این به آن دلیل است که، فقط درحافظه ذخیره ‌می‌شود، خیلی همانند یک متغیر، اما تا موقعی که هنوز فراخوانی نشده است. برای اجرای تابع، به این طریق باید عمل کنید:

    $ sum 1 4
    1 + 4 = 5

شگفتا! اکنون یک ماشین حساب ابتدایی داریم، و جایگزین بالقوه مقرون به صرفه‌تری برای یک کودک پنج‌ساله.

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

   1 #!/bin/bash
   2 sum() {
   3         echo "$1 + $2 = $(($1 + $2))"
   4 }
   5 sum "$1" "$2"

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

توابع در اسکریپت چند هدف را برآورده می‌سازند. اول آنکه یک بلوک از کدها که وظیفه معینی انجام می‌دهند را مجزا می‌کنند، به طوری که مانع درهم ریختگی سایر کدها می‌گردد. این مطلب تا وقتی اعتدال را رعایت می‌کنید، به شما کمک می‌کند، کدهای خواناتر بنویسید. ( پرش در طول اسکریپت برای پیگردی 7تابع جهت کشف آنکه یک دستور منفرد چه کار می‌کند، تأثیر منفی خواهد داشت، بنابراین درنظر داشته باشید کاری که انجام می‌دهید، قابل فهم باشد.) دوم، میسر نمودن استفاده مجدد از کد با تغییر جزئی شناسه‌ها است.

این یک مثال کمتر فاقد کیفیت:

   1 #!/bin/bash
   2 open() {
   3     case "$1" in
   4         *.mp3|*.ogg|*.wav|*.flac|*.wma) xmms "$1";;
   5         *.jpg|*.gif|*.png|*.bmp)        display "$1";;
   6         *.avi|*.mpg|*.mp4|*.wmv)        mplayer "$1";;
   7     esac
   8 }
   9 for file; do
  10     open "$file"
  11 done

در اینجا تابعی به نام open تعریف نموده‌ایم. این تابع قطعه‌ای کُد است که یک شناسه منفرد را دریافت می‌کند، و بر اساس الگوی آن شناسه، برنامه xmms یا display یا mplayer را با آن شناسه اجرا خواهد نمود. سپس، یک حلقه for با تمام پارامترهای مکانی اسکریپت تکرار می‌شود. (به خاطر داشته باشید که ‎ for file‎ معادل ‎for file in "$@"‎ می‌باشد و هر یک از آنها تکرار روی مجموعه کامل پارامترهای موقعیتی را انجام می‌دهند.) حلقه for برای هر یک از پارامترها، تابع open را فراخوانی می‌کند.

به طوری که شاید ملاحظه نموده باشید، پارامترهای تابع غیر از پارامترهای اسکریپت هستند.

همچنین، تابع ممکن است متغیرهای محلی داشته باشد، که با دستور داخلی local یا declare تعریف شده باشند. این امر شما را قادر می‌سازد بدون احتمال رونویسی متغیرهای مهم، توابع را فراخوانی کنید. برای نمونه:

    count() {
        local i
        for ((i=1; i<=$1; i++)); do echo $i; done
        echo 'Ah, ah, ah!'
    }
    for ((i=1; i<=3; i++)); do count $i; done

متغیر iمحلی به طور متمایز از متغیر i خارج از تابع اسکریپت، ذخیره می‌گردد. این باعث می‌شود هر یک از دو حلقه،بدون تداخل با شمارش‌گر دیگری عمل کند.

توابع می‌توانند خودشان را نیز به طور بازگشتی فراخوانی نمایند، اما در اینجا به آن نمی‌پردازیم. شاید بعداً!



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

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