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

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

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
}

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

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

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *