از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
توابع Bash
سرفصلهای مطلب
یک تابع Bash یک بلوک قابل استفاده مجدد از دستورات است که می تواند چندین بار در یک اسکریپت فراخوانی شود. توابع به شما کمک می کند تا خود را بسازید bash اسکریپت ها خوانا تر، راحت تر نگهداری می شوند و کمتر تکرار می شوند.
در حالی که توابع Bash نسبت به سایر زبان های برنامه نویسی محدودتر هستند، اما همچنان برای اسکریپت نویسی پوسته بسیار قدرتمند هستند.
در این راهنما، ما اصول اولیه توابع Bash را پوشش می دهیم و به شما نشان می دهیم که چگونه از آنها در اسکریپت های پوسته خود استفاده کنید.
تعریف توابع Bash
دو روش مختلف برای تعریف یک تابع در Bash وجود دارد.
-
فرمت اول با نام تابع و به دنبال آن پرانتز شروع می شود. این سینتکس ترجیحی و پرکاربرد است.
function_name () { commands }نسخه تک خطی:
function_name () { commands; } -
فرمت دوم با کلمه رزرو شده شروع می شود
functionو به دنبال آن نام تابع قرار می گیرد.function function_name { commands }نسخه تک خطی:
function function_name { commands; }
نکات مهم قابل توجه:
- دستورات داخل بریس های فرفری (
{}) بدن تابع را تشکیل می دهند. - بریس های باز و بسته باید با فاصله یا خطوط جدید از بدنه جدا شوند.
- یک تابع فقط زمانی اجرا می شود که به طور صریح با نام فراخوانی شود.
- تابع باید قبل از فراخوانی تعریف شود.
- هنگام استفاده از توابع “فشرده” تک خطی، نقطه ویرگول
;بعد از آخرین دستور لازم است. - در صورت امکان از نام توابع توصیفی استفاده کنید.
مثال: تابع Hello World
برای درک بهتر این موضوع، به مثال زیر توجه کنید:
#!/bin/bash
hello_world () {
echo 'Hello, World.'
}
hello_world
بیایید کد را خط به خط تجزیه و تحلیل کنیم:
- در خط 3، تابع را با نامگذاری تعریف می کنیم. بریس فرفری
{شروع بدن عملکرد را نشان می دهد. - خط
4بدن عملکرد است. بدنه تابع می تواند شامل چندین دستور، عبارات و اعلان های متغیر باشد. - خط
5، بسته شدن براکت فرفری}، پایان را تعریف می کندhello_worldتابع - در صف
7، ما در حال اجرای تابع هستیم. می توانید این تابع را هر چند بار که نیاز دارید اجرا کنید.
اجرای چاپ اسکریپت:
Hello, World.
دامنه متغیر در توابع Bash
متغیرهای جهانی
- متغیرهای سراسری متغیرهایی هستند که در هر نقطه از اسکریپت، از جمله توابع داخلی، قابل دسترسی و تغییر هستند.
- به طور پیش فرض، همه متغیرها به عنوان جهانی تعریف می شوند، حتی اگر در داخل تابع تعریف شوند.
Local متغیرها
- Local متغیرها با اعلان می شوند
localکلمه کلیدی - Local متغیرها را می توان فقط در داخل تابع اعلام کرد و فقط در داخل آن تابع قابل استفاده است.
- شما می توانید متغیرهای محلی با نام یکسان در توابع مختلف داشته باشید.
- Local متغیرها متغیرهای سراسری با همان نام را در تابع لغو می کنند.
مثال: دامنه متغیر
برای بهتر نشان دادن روش عملکرد متغیر دامنه در Bash، اجازه دهید این مثال را در نظر بگیریم:
#!/bin/bash
var1='A'
var2='B'
my_function () {
local var1='C'
var2='D'
echo "Inside function: var1: $var1, var2: $var2"
}
echo "Before executing function: var1: $var1, var2: $var2"
my_function
echo "After executing function: var1: $var1, var2: $var2"
اسکریپت با تعریف دو متغیر سراسری شروع می شود var1 و var2. سپس یک تابع وجود دارد که یک متغیر محلی را تنظیم می کند var1 و متغیر سراسری را تغییر می دهد var2.
اگر اسکریپت را اجرا کنید، باید خروجی زیر را ببینید:
Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D
از خروجی بالا می توان نتیجه گرفت که:
- هنگامی که یک متغیر محلی در یک تابع با همان نام یک متغیر جهانی موجود تعریف می شود، متغیر محلی اولویت دارد.
- متغیرهای سراسری را می توان از داخل تابع تغییر داد.
مقادیر را در توابع Bash برگردانید
بر خلاف توابع در زبان های برنامه نویسی واقعی، توابع Bash هنگام فراخوانی مقادیری را بر نمی گرداند. وقتی یک bash تابع کامل می شود، مقدار بازگشتی آن وضعیت آخرین دستور اجرا شده در تابع است:
0برای موفقیت- هر مقدار غیر صفر در محدوده (1 – 255) برای خرابی.
وضعیت بازگشت را می توان با استفاده از return کلمه کلیدی، و به متغیر اختصاص داده می شود $?. را return بیانیه عملکرد را خاتمه می دهد. می توانید آن را به عنوان وضعیت خروج تابع در نظر بگیرید.
#!/bin/bash
my_function () {
echo "some result"
return 55
}
my_function
echo $?
some result
55
برگرداندن داده ها از یک تابع
از آنجایی که Bash نمی تواند مقادیر دلخواه را مستقیماً برگرداند، باید از روش های دیگری استفاده کنیم. دو راه حل رایج وجود دارد.
-
استفاده از متغیر جهانی:
ساده ترین گزینه اختصاص دادن نتیجه تابع به یک متغیر سراسری است:
~/return_values.sh#!/bin/bash my_function () { func_result="some result" } my_function echo $func_resultsome result -
استفاده از خروجی استاندارد (توصیه می شود)
گزینه دیگر ارسال مقدار به
stdoutبا استفاده ازecho
یاprintf
. این رویکرد تمیزتر است و از متغیرهای جهانی غیر ضروری جلوگیری می کند:~/return_values.sh#!/bin/bash my_function () { local func_result="some result" echo "$func_result" } func_result="$(my_function)" echo $func_resultsome resultبه جای اجرای ساده تابعی که پیام را در آن چاپ می کند
stdout، خروجی تابع را بهfunc_resultمتغیر با استفاده از$()تعویض فرمان متغیر بعداً می تواند در صورت نیاز مورد استفاده قرار گیرد.
انتقال آرگومان ها به توابع
آرگومان ها با قرار دادن آنها پس از نام تابع، جدا از یک فاصله، به یک تابع منتقل می شوند. برای جلوگیری از تجزیه نادرست یک آرگومان با فاصله در آن، دوبار نقل قول کردن آرگومان ها تمرین خوبی است.
function_name arg1 arg2 arg3
متغیرهای ویژه
- پارامترهای موقعیت
$1،$2،$3…$n، با موقعیت پارامتر بعد از نام تابع مطابقت دارد. - را
$0متغیر برای نام تابع رزرو شده است. - را
$#متغیر تعداد پارامترهای موقعیتی/آگومان های ارسال شده به تابع را نگه می دارد. - را
$*و$@متغیرها همه پارامترها/آرگمون های موقعیتی ارسال شده به تابع را در خود نگه می دارند.- وقتی دو نقل قول می شود،
"$*"به یک رشته منفرد جدا شده با فاصله (نخستین کاراکتر IFS) گسترش می یابد –"$1 $2 $n". - وقتی دو نقل قول می شود،
"$@"به رشته های جداگانه گسترش می یابد –"$1" "$2" "$n". - وقتی دو نقل قول نمی شود،
$*و$@یکسان هستند.
- وقتی دو نقل قول می شود،
در اینجا یک مثال است:
#!/bin/bash
greeting () {
echo "Hello $1"
}
greeting "Zoe"
Hello Zoe
نتیجه گیری
تابع Bash بلوکی از کد قابل استفاده مجدد است که برای انجام یک عملیات خاص طراحی شده است. پس از تعریف، تابع را می توان چندین بار در یک اسکریپت فراخوانی کرد.
توابع به ویژه برای تکرار کارها، ساده کردن اسکریپت های پیچیده و ایجاد کد قابل خواندن و ماژولار مفید هستند.
همچنین می توانید در مورد روش استفاده از یک تابع Bash برای ایجاد یک دستور میانبر به یاد ماندنی (نام مستعار) برای یک فرمان طولانی تر بخوانید.
اگر سوال یا بازخوردی دارید، در کامنت بگذارید.
terminal
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1404-12-16 15:22:06

