راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

تمرین ها »
« مثال‌های توابع در اسکریپت‌ها

فصل 11: توابع

فهرست مطالب

مقدمه
توابع چیستند؟
دستور زبان توابع
پارامترهای موضعی در توابع
نمایش توابع
مثال‌های توابع در اسکریپت‌ها
بازیابی
تنظیم path
پشتیبان‌های راه دور
خلاصه
تمرین‌ها

چکیده

در این فصل، در باره این موارد صحبت خواهیم نمود

  • توابع چه هستند

  • ایجاد و نمایش توابع از خط‌فرمان

  • توابع در اسکریپت‌ها

  • عبور دادن شناسه‌ها به توابع

  • موقعی که از توابع استفاده می‌شود

مقدمه

توابع چه می‌باشند؟

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

دستورات داخلی خاص در حین جستجوی فرمان پیش از توابع پیدا می‌شوند. دستورات داخلی خاص عباتند از: break و :، .، continue، eval، exec، exit، export، readonly، return، set، shift، trap و unset.

دستور زبان توابع

توابع با ترکیب

function FUNCTION { COMMANDS; } یا FUNCTION () { COMMANDS; }

به کار می‌روند، هر دو ترکیب، یک تابع پوسته FUNCTION تعریف می‌کنند. استفاده از دستور داخلی function اختیاری است، در هرحال، اگر به کار نرود، پرانتزها ضروری هستند.

دستورات لیست شده بین ابروها بدنه تابع را تشکیل می‌دهند. این دستورات، هر وقت که FUNCTION به عنوان نام یک فرمان تعیین شده باشد، اجرا می‌شوند. کد خروج، کد وضعیت آخرین دستور اجرا شده در بدنه تابع است.

[Note]اشتباهات متداول

ابروها باید با فاصله از بدنه جدا بشوند، در غیر این‌صورت به طریق اشتباه تفسیر می‌گردند.

بدنه یک تابع باید به یک سمی‌کالن یا سطر جدید ختم شود.

پارامترهای موضعی در توابع

توابع مشابه اسکریپت کوچک می‌باشند: می‌توانند پارامترها را قبول کنند، می‌توانند متغیرهایی که فقط در تابع شناخته می‌شوند ( با کاربرد دستور داخلی local پوسته )، را استفاده کنند، و می‌توانند کمیت‌ها را به شل فراخواننده برگردانند.

یک تابع همچنین سیستمی برای تفسیر پارامترهای موضعی دارد. به‌هرحال، پارامترهای موضعی تحویل شده به تابع همان‌هایی نیستند که به اسکریپت تحویل گردیده‌اند.

موقعی که تابع اجرا می‌گردد، شناسه‌های تابع در طول مدت اجرای آن، پارامترهای موضعی می‌شوند. پارامتر ویژه # که به تعداد پارامترهای موضعی بسط می‌یابد، برای انعکاس تغییر، به‌هنگام‌سازی می‌شود. پارامتر موضعی 0عوض نمی‌شود. متغیر FUNCNAME در ‌Bash برابر نام تابع، در مدتی که در حال اجرا می‌باشد، قرار داده می‌شود.

اگر دستور داخلی return در یک تابع اجرا شود، تابع تمام می‌شود و اجرا با دستور بعد از فراخوانی تابع ادامه می‌یابد. موقعی که تابع پایان می‌یابد، پارامترهای موضعی و پارامتر خاص # به مقادیری که قبل از اجرای تابع داشتند بازیابی می‌شوند. اگر یک شناسه عددی به دستور return داده شود، آن عدد کد وضعیت برگشتی می‌شود. یک مثال ساده:

[lydia@cointreau ~/test] cat showparams.sh
#!/bin/bash
                                                                                
echo "This script demonstrates function arguments."
echo
                                                                                
echo "Positional parameter 1 for the script is $1."
echo
                                                                                
test ()
{
echo "Positional parameter 1 in the function is $1."
RETURN_VALUE=$?
echo "The exit code of this function is $RETURN_VALUE."
}
                                                                                
test other_param

[lydia@cointreau ~/test] ./showparams.sh parameter1
This script demonstrates function arguments.
 
Positional parameter 1 for the script is parameter1.
 
Positional parameter 1 in the function is other_param.
The exit code of this function is 0.

[lydia@cointreau ~/test]

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

if [ $RETVAL -eq 0 ]; then
	<start the daemon>

یا مانند این مثال ازاسکریپت ‎ /etc/init.d/amd‎، که در آن ویژگی‌های بهینه‌سازی Bash استفاده می‌شوند:

[ $RETVAL = 0 ] && touch /var/lock/subsys/amd

دستورات پس از ‎ &&‎ فقط موقعی اجرا می‌شوند که بررسی به یک نتیجه صحیح برسد، این یک راه کوتاه‌تر برای نشان دادن یک ساختار ‎ if/then/fi‎ می‌باشد.

کد برگشتی تابع غالباً به عنوان کد خروج تمام اسکریپت استفاده می‌شود. تعداد زیادی اسکریپت‌های init ختم شده به چنین چیزی :
‎exit $RETVAL‎ را خواهید یافت .

نمایش توابع

تمام توابع شناخته شده در شل جاری می‌توانند با استفاده از دستور داحلی set بدون هیچ گزینه، نمایش داده شوند. توابع بعد از اینکه اجرا می‌شوند حفظ می‌شوند، مگر اینکه بعد از استفاده unset بشوند. دستور which نیز توابع را نمایش می‌دهد:

[lydia@cointreau ~] which zless
zless is a function
zless ()
{
    zcat "$@" | "$PAGER"
}

[lydia@cointreau ~] echo $PAGER
less

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

این یکی برای کاربران DOS :

dir ()
{
    ls -F --color=auto -lF --color=always "$@" | less -r
}
تمرین ها »
« مثال‌های توابع در اسکریپت‌ها
ترجمه محمود پهلوانی