توابع
توابع در اسکریپتهای bash خیلی جذاب هستند. بلوکهایی از فرمانها میباشند، خیلی مشابه اسکریپتهای عادی، که شاید شما بنویسید، به جز آنکه به صورت فایلهای جداگانه نیستند. هرچند که، آنها درست مانند اسکریپتها شناسهها را میپذیرند -- و بر خلاف اسکریپتها، اگر شما بخواهید، میتوانند بر متغیرهای داخل اسکریپتهای شما تأثیرگذار باشند. برای مثال این مورد را ملاحظه کنید:
$sum() { > echo "$1 + $2 = $(($1 + $2)) " >}
این نمونه وقتی اجرا شود، مطلقاً کاری انجام نمیدهد. این به آن دلیل است که، فقط درحافظه ذخیره میشود، خیلی همانند یک متغیر، اما تا موقعی که هنوز فراخوانی نشده است. برای اجرای تابع، به این طریق باید عمل کنید:
$sum 1 4 1 + 4 = 5
شگفتا! اکنون یک ماشین حساب ابتدایی داریم، و جایگزین بالقوه مقرون به صرفهتری برای یک کودک پنجساله.
اگر بخواهید توابع را در داخل اسکریپتها تعبیه کنید، که بسیار مناسبتر خواهد بود، آنوقت لازم است متوجه باشید، پارامترهایی که با اسکریپت به کار میبرید، لزوماً نبایستی همان پارامترهای داده شده به تابع باشند. برای پوشاندن این تابع در داخل یک اسکریپت، باید چنین فایلی بنویسیم:
به طوری که میتوانید ملاحظه کنید، ما دو پارامتر اسکریپت را به تابع داخل آن دادهایم، اما میتوانستیم هر پارامتر دیگری که مایل باشیم به تابع بدهیم، (اگرچه ، این حالت فقط موجب سردرگمی کاربران استفاده کننده از آن خواهد شد).
توابع در اسکریپت چند هدف را برآورده میسازند. اول آنکه یک بلوک از کدها که وظیفه معینی انجام میدهند را مجزا میکنند، به طوری که مانع درهم ریختگی سایر کدها میگردد. این مطلب تا وقتی اعتدال را رعایت میکنید، به شما کمک میکند، کدهای خواناتر بنویسید. ( پرش در طول اسکریپت برای پیگردی 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
در اینجا تابعی به نام
به طوری که شاید ملاحظه نموده باشید، پارامترهای تابع غیر از پارامترهای اسکریپت هستند.
همچنین، تابع ممکن است متغیرهای محلی داشته باشد، که با دستور داخلی local یا declare تعریف شده باشند. این امر شما را قادر میسازد بدون احتمال رونویسی متغیرهای مهم، توابع را فراخوانی کنید. برای نمونه:
count() { locali for (( i =1 ;i <=$1;i ++));do echo$ i ; done echo \'Ah, ah, ah!\'} for (( i =1;i <=3;i ++));do count $ i ;done
متغیر
توابع میتوانند خودشان را نیز به طور بازگشتی فراخوانی نمایند، اما در اینجا به آن نمیپردازیم. شاید بعداً!
در مستندات گنو: Shell Functions