فهرست مطالب
چکیده
در این فصل، در باره این موارد صحبت خواهیم نمود
توابع چه هستند
ایجاد و نمایش توابع از خطفرمان
توابع در اسکریپتها
عبور دادن شناسهها به توابع
موقعی که از توابع استفاده میشود
توابع پوسته، روشی برای گروهبندی دستورات جهت اجرای بعدی، با استفاده از نام منفرد این گروه یا routine هستند. نام این گروه باید در داخل پوسته یا اسکریپت منحصر دبهفرد باشد. تمام دستوراتی که یک تابع را تشکیل میدهند مانند دستورات عادی اجرا میشوند. موقعی که یک تابع ته عنوان یک نام دستور ساده فراخوانی میشود، لیست دستورات مرتبط با آن تابع اجرا میشوند. یک تابع در داخل پوستهای که در آن تعریف شده است، اجرا میشود: پردازش جدیدی برای تفسیر دستورات ایجاد نمیشود.
دستورات داخلی خاص در حین جستجوی فرمان پیش از توابع پیدا میشوند. دستورات داخلی خاص عباتند از: break و :، .، continue، eval، exec، exit، export، readonly، return، set، shift، trap و unset.
توابع با ترکیب
function FUNCTION { COMMANDS; }
یا FUNCTION () { COMMANDS; }
به کار میروند، هر دو ترکیب، یک تابع پوسته FUNCTION تعریف میکنند. استفاده از دستور داخلی function اختیاری است، در هرحال، اگر به کار نرود، پرانتزها ضروری هستند.
دستورات لیست شده بین ابروها بدنه تابع را تشکیل میدهند. این دستورات، هر وقت که FUNCTION به عنوان نام یک فرمان تعیین شده باشد، اجرا میشوند. کد خروج، کد وضعیت آخرین دستور اجرا شده در بدنه تابع است.
اشتباهات متداول | |
---|---|
ابروها باید با فاصله از بدنه جدا بشوند، در غیر اینصورت به طریق اشتباه تفسیر میگردند. بدنه یک تابع باید به یک سمیکالن یا سطر جدید ختم شود. |
توابع مشابه اسکریپت کوچک میباشند: میتوانند پارامترها را قبول کنند، میتوانند متغیرهایی که فقط در تابع شناخته میشوند ( با کاربرد دستور داخلی local پوسته )، را استفاده کنند، و میتوانند کمیتها را به شل فراخواننده برگردانند.
یک تابع همچنین سیستمی برای تفسیر پارامترهای موضعی دارد. بههرحال، پارامترهای موضعی تحویل شده به تابع همانهایی نیستند که به اسکریپت تحویل گردیدهاند.
موقعی که تابع اجرا میگردد، شناسههای تابع در طول مدت اجرای آن، پارامترهای موضعی میشوند. پارامتر ویژه #
که به تعداد پارامترهای موضعی بسط مییابد، برای انعکاس تغییر، بههنگامسازی میشود. پارامتر موضعی 0
عوض نمیشود. متغیر FUNCNAME
در Bash برابر نام تابع، در مدتی که در حال اجرا میباشد، قرار داده میشود.
اگر دستور داخلی return در یک تابع اجرا شود، تابع تمام میشود و اجرا با دستور بعد از فراخوانی تابع ادامه مییابد. موقعی که تابع پایان مییابد، پارامترهای موضعی و پارامتر خاص #
به مقادیری که قبل از اجرای تابع داشتند بازیابی میشوند. اگر یک شناسه عددی به دستور return داده شود، آن عدد کد وضعیت برگشتی میشود. یک مثال ساده:
[lydia@cointreau ~/test]
catshowparams.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.shparameter1
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 ~]
whichzless
zless is a function zless () { zcat "$@" | "$PAGER" }[lydia@cointreau ~]
echo$PAGER
less
این نوعی تابع است که به طور نوعی در فایلهای منبع پیکربندی پوسته کاربر، پیکربندی گردیده است. توابع بیشتر از مستعارها انعطافپذیر هستند وراه سهل و سادهای برای وفق دادن محیط کاربر فراهم میکنند.
این یکی برای کاربران DOS :
dir () { ls -F --color=auto -lF --color=always "$@" | less -r }