• ثبت نام
  • ورود
  • 49624 - 021 تلفن
  • ثبت نام
  • ورود
  • 49624 - 021 تلفن

اسکریپت نویسی پیشرفته لینوکس برای وبمستر ها – قسمت ۲ – توابع پیشرفته

AdvancedLinuxShell-2 - novinhost.org

AdvancedLinuxShell-2 - novinhost.org

در قسمت قبل یاد گرفتیم که توابع در اسکریپت نویسی شل لینوکس به صورت

name(){

 Commands

 return $VAR

}

تعریف میشوند.

در این قسمت قصد داریم به مباحث پیشرفته تر تعریف توابع بپردازیم:

 

 

AdvancedLinuxShell-2 - novinhost.org

دستور 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
}

طبق معمول در این جلسه هم یک سایت خوب برای یادگیری اسکریپت نویسی معرفی میکنیم»

وبسایت http://www.bashguru.com/ مطالب بسیار مفیدی در زمینه مدیریت لینوکس و اسکریپت نویسی ارائه میدهد.

نوشته مشابه

ثبت نظر