اسکریپت نویسی پیشرفته لینوکس برای وبمستر ها – قسمت ۲ – توابع پیشرفته : در قسمت قبل یاد گرفتیم که توابع در اسکریپت نویسی شل لینوکس به صورت
name(){
Commands
return $VAR
}
تعریف میشوند.
در این قسمت قصد داریم به مباحث پیشرفته تر تعریف توابع بپردازیم
اسکریپت نویسی پیشرفته لینوکس توابع پیشرفته
دستور export –f:
فرض کنید تابعی به صورت زیر دارید:
fname(){
echo "Foo"
}
در صورتی که بخواهید این تابع را به صورت متغیر استفاده کنید, دستور export –f fname را وارد کنید.
در این صورت موقع استفاده از متغیر fname , مثلا در دستور echo $fname دستورات داخل تابع fname اجرا خواهند شد و مقدار خروجی تابع به عنوان مقدار متغییر در نظر گرفته خواهد شد. این دستور برای مواقعی که در دفعات مکرر قصد استفاده از خروجی تابع را دارید مفید خواهد بود.
دستور readonly:
این دستور تابع را غیر قابل تغییر میکند, یعنی پس از یک بار تعریف و readonly کردن تابع, با تعریف تابع جدیدی به همان نام, تابع تغییری نخواهد کرد.
به این مثال توجه کنید: تابعی به صورت زیر تعریف میکنیم:
function hello() { echo "Hello world"; }
با نوشتن دستور hello احضار شده و خروجی Hello World چاپ میشود.
حالا در همان اسکریپت تابع زیر را تعریف میکنیم:
function hello() { echo "Hello, let us be friends."; }
به تعریف تابعی که قبلا هم نام آن وجود داشته, آپدیت کردن تابع میگویند.
حالا دیگر با احضار تابع hello خروجی به صورت Hello, let us be friends خواهد بود.
در صورتی که بخواهید از تابع اول حفاظت کنید, و جلوی آپدیت شدن آن را بگیرید, پس از تعریف تابع اول , دستور
readonly -f hello
را وارد کنید, در این صورت, حتی اگر تابعی همنام تابع اول تعریف شود, با احضار کردن تابع, دستورات تابع اول اجرا خواهد شد.
توابع محلی:
بعضی متغیر ها مثل x و y ممکن است بسیار پر استفاده باشند, ممکنطراحی سایتسئو است شما چنین متغیری را به عنوان سراسری تعریف کرده باشد, و نگران این باشید که اگر در تابع دوباره چنین متغیری تعریف کنید, به مشکل بر بخورید, برای رفع این مشکل از دستور local استفاده میکنیم. کافیست متغیر x را به صورت local x=1 تعریف کنید, در این صورت متغیر x در داخل تابع با محتوی ۱ و خارج از تابع با مقدار متغیر سراسری x (اگر تعریف شده باشد) شناخته خواهد شد. به مثال زیر توجه کنید:
#!/bin/bash
# gloabal x and y
x=200
y=100
math(){
# local variable x and y with passed args
local x=$1
local y=$2
echo $(( $x + $y ))
}
echo "x: $x and y: $y"
# call function
echo "Calling math() with x: $x and y: $y"
math 5 10
# x and y are not modified by math()
echo "x: $x and y: $y after calling math()"
echo $(( $x + $y ))
میبینید که هم تابع math توابع x و y را تعریف کرده و هم به صورت سراسری تعریف شده اند.
موقعی که تابع math احضار میشود تا مقدار این دو متغیر را چاپ کند, مقداری متفاوت با آنچه در متغیر سراسری تعریف شده, چاپ خواهد شد. در واقع ما با دستور local متغیر های x و y را داخل تابع math محلی کرده ایم.
توابع بازگشتی یا recursive:
توابع بازگشتی برای اجرای برخی الگوریتم ها مثل فاکتوریل بسیار مفید هستند.
در واقع recursion به احضار کردن تابع در داخل همان تابع گفته میشود, شاید انتظار داشته باشید این کار باعث بروز خطا شود, اما اگر درست به کار بسته شود نه تنها با ارور مواجه نخواهید شد بلکه بسیار مفید واقع خواهد شد.
به مثال فاکتوریل توجه کنید:
factorial ()
{
local number=$1
if [ $number -eq 0 ]
then
Factorial=1
else
let “next = number – 1”
factorial $next
Factorial=`echo $number * $Factorial | bc`
# let “Factorial = $number * $Factorial”
fi
return $Factorial 2>/dev/null
}
طبق معمول در این جلسه هم یک سایت خوب برای یادگیری اسکریپت نویسی معرفی میکنیم»