لینوکسی بشیم: توابع در bash

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

برای این نوشته فرض شده که شما با دستورات ابتدایی لینوکس آشنایی دارید. هم‌چنین مفاهیم ابتدایی اسکریپت‌نویسی رو هم بلدید و با بش هم آشنایی دارید. میتونید قسمت‌های قبلی این دنباله رو برای این کار مطالعه کنید. یه کوچولو هم با توابع تو یه زبان برنامه نویسی کار کرده باشید هم که چه بهتر.

تابع یه تعدادی دستور رو در بر می‌گیره و وقتی صدا زده بشه اونا رو اجرا میکنه. معمولا اسکریپت‌هایی که مینویسیم مثل یه نرم‌افزار خیلی بزرگ نمیشن ولی باز هم نوشتن توابع و گذاشتن یک عملکرد خاص داخل اون به تمیزتر شدن و نوشتن بهتر اسکریپت کمک میکنه.

ساختار یک تابع رو می‌بینید:

function say_hello {
    echo 'Hello from PaaSino'
}

میتونیم این شکلی هم تعریفش کنیم:

say_hello() {     
    echo 'Hello from PaaSino' 
}

تو اولی فقط function نوشتم و اسم تابع رو. دیگه پرانتز نذاشتم. تو دومی پرانتز میذارم ولی function رو نمی‌نویسم. شخصا اولی رو ترجیح میدم؛ چون اولا لازم نیست یک بار یا دو بار بسته به نوع ویرایشگر برای نوشتن پرانتز شیفت رو بگیرم :) و این مفهوم که تابع تو بش مثل زبان‌های برنامه‌نویسی ورودی نمی‌گیره رو میرسونه. مورد دوم رو جلوتر می‌بینیم. حالا که ساختارش رو شناختیم هر دستوری می‌تونیم توش بنویسیم.

این همه دستور نوشتیم چه جوری صداش بزنیم؟ خیلی راحت فقط اسم تابع رو می‌نویسیم:

حالا اسکریپت رو اجرا می‌کنیم:

یادتون نره قابلیت اجرایی بدید به فایلتون.

تو زبونای برنامه‌نویسی دو تا چیز دیگه از تابع دیده بودیم: ورودی و خروجی. تو بش و کلا تو شل لینوکس هم این‌ها رو داریم ولی یه کم فرق داره. اول بریم سراغ ورودی. برای ورودی دادن جلوی اسم تابع ورودی‌ها رو می‌نویسیم:

تو تابع چجوری ورودی‌ها رو بگیریم؟ اولا که اینا یه متغیرن و باید از $ استفاده کنیم. بعد هم ورودی‌ها به ترتیب با اعداد نام‌گذاری میشن:

اجرا می‌کنیم:

میتونید با #$ تعداد ورودی‌ها رو ببینید:

اینم خروجیش:

میتونیم کل ورودی‌ها رو با *$ با فاصله از هم بگیریم تا مثلا for بزنیم روش:

خروجی اینو خودتون ببینید.

نوبت خروجی‌ها شد. واسه خروجی دادن دو تا کار میشه کرد. اولیش با return هست. شما با return میتونید فقط عدد پس بدید اونم از 0 تا 255. این اعداد exit code برنامه شما هستن و میشه بعد از اجرای تابع اون رو در ?$ پیدا کرد:

خروجی اسکریپت در بش:

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

برای گرفتن خروجی که با echo میدیم چیکار کنیم؟ دقت کنید به طور پیش‌فرض echo تو stdout مینویسه. مثل تابعی که اون اول نوشتیم. من اگه بخوام خروجی تابع یا هر چیزی رو از stdout به یه متغیر بریزم از کاراکتر back tick یا ` استفاده می‌کنم. چی؟! پیداش نمی‌کنین؟ اون پایین ESC نشسته بیچاره. خیلی هم تو اسکریپت‌نویسی به دردتون میخوره:

الان من دستور ls رو اجرا کردم و گفتم به جای این که بذاریش تو stdout بذارش تو متغیر ls_out. در مورد تابع هم همینطوره:

و خروجی دستورات:

پس یادتون باشه با back tick شما به جای اینکه خروجی هر دستوری رو بریزید توی stdout می‌ریزید توی یه متغیر تا بعدا ازش استفاده کنید.

اینم از تابع. مطلب جدید زیاد داشت. سعی کنید تمرین کنید و خوب یاد بگیرید که بعدا خواستیم یه مثال جدی رو انجام بدیم راحت باشید. امیدوارم براتون مفید بوده باشه. اگر نظر یا سوالی دارید این پایین بفرمایید.

قسمت قبلی

قسمت بعدی