وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

توابع Bash

0 0
زمان لازم برای مطالعه: 4 دقیقه



یک تابع Bash یک بلوک قابل استفاده مجدد از دستورات است که می تواند چندین بار در یک اسکریپت فراخوانی شود. توابع به شما کمک می کند تا خود را بسازید bash اسکریپت ها خوانا تر، راحت تر نگهداری می شوند و کمتر تکرار می شوند.

در حالی که توابع Bash نسبت به سایر زبان های برنامه نویسی محدودتر هستند، اما همچنان برای اسکریپت نویسی پوسته بسیار قدرتمند هستند.

در این راهنما، ما اصول اولیه توابع Bash را پوشش می دهیم و به شما نشان می دهیم که چگونه از آنها در اسکریپت های پوسته خود استفاده کنید.

تعریف توابع Bash

دو روش مختلف برای تعریف یک تابع در Bash وجود دارد.

  1. فرمت اول با نام تابع و به دنبال آن پرانتز شروع می شود. این سینتکس ترجیحی و پرکاربرد است.

    function_name () {
      commands
    }

    نسخه تک خطی:

    function_name () { commands; }
  2. فرمت دوم با کلمه رزرو شده شروع می شود functionو به دنبال آن نام تابع قرار می گیرد.

    function function_name {
      commands
    }

    نسخه تک خطی:

    function function_name { commands; }

نکات مهم قابل توجه:

  • دستورات داخل بریس های فرفری ({}) بدن تابع را تشکیل می دهند.
  • بریس های باز و بسته باید با فاصله یا خطوط جدید از بدنه جدا شوند.
  • یک تابع فقط زمانی اجرا می شود که به طور صریح با نام فراخوانی شود.
  • تابع باید قبل از فراخوانی تعریف شود.
  • هنگام استفاده از توابع “فشرده” تک خطی، نقطه ویرگول ; بعد از آخرین دستور لازم است.
  • در صورت امکان از نام توابع توصیفی استفاده کنید.

مثال: تابع Hello World

برای درک بهتر این موضوع، به مثال زیر توجه کنید:

~/hello_world.sh
#!/bin/bash

hello_world () {
   echo 'Hello, World.'
}

hello_world

بیایید کد را خط به خط تجزیه و تحلیل کنیم:

  • در خط 3، تابع را با نامگذاری تعریف می کنیم. بریس فرفری { شروع بدن عملکرد را نشان می دهد.
  • خط 4 بدن عملکرد است. بدنه تابع می تواند شامل چندین دستور، عبارات و اعلان های متغیر باشد.
  • خط 5، بسته شدن براکت فرفری }، پایان را تعریف می کند hello_world تابع
  • در صف 7، ما در حال اجرای تابع هستیم. می توانید این تابع را هر چند بار که نیاز دارید اجرا کنید.

اجرای چاپ اسکریپت:

Hello, World.

دامنه متغیر در توابع Bash

متغیرهای جهانی

  • متغیرهای سراسری متغیرهایی هستند که در هر نقطه از اسکریپت، از جمله توابع داخلی، قابل دسترسی و تغییر هستند.
  • به طور پیش فرض، همه متغیرها به عنوان جهانی تعریف می شوند، حتی اگر در داخل تابع تعریف شوند.
پیشنهاد می‌کنیم بخوانید:  روش پیکربندی و مدیریت فایروال در CentOS 8

Local متغیرها

  • Local متغیرها با اعلان می شوند local کلمه کلیدی
  • Local متغیرها را می توان فقط در داخل تابع اعلام کرد و فقط در داخل آن تابع قابل استفاده است.
  • شما می توانید متغیرهای محلی با نام یکسان در توابع مختلف داشته باشید.
  • Local متغیرها متغیرهای سراسری با همان نام را در تابع لغو می کنند.

مثال: دامنه متغیر

برای بهتر نشان دادن روش عملکرد متغیر دامنه در Bash، اجازه دهید این مثال را در نظر بگیریم:

~/variables_scope.sh
#!/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 بیانیه عملکرد را خاتمه می دهد. می توانید آن را به عنوان وضعیت خروج تابع در نظر بگیرید.

~/return_values.sh
#!/bin/bash

my_function () {
  echo "some result"
  return 55
}

my_function
echo $?
some result
55

برگرداندن داده ها از یک تابع

از آنجایی که Bash نمی تواند مقادیر دلخواه را مستقیماً برگرداند، باید از روش های دیگری استفاده کنیم. دو راه حل رایج وجود دارد.

  1. استفاده از متغیر جهانی:

    ساده ترین گزینه اختصاص دادن نتیجه تابع به یک متغیر سراسری است:

    ~/return_values.sh
    #!/bin/bash
    
    my_function () {
      func_result="some result"
    }
    
    my_function
    echo $func_result
    
    some result
    
  2. استفاده از خروجی استاندارد (توصیه می شود)

    گزینه دیگر ارسال مقدار به stdout با استفاده از echo
    یا printf
    . این رویکرد تمیزتر است و از متغیرهای جهانی غیر ضروری جلوگیری می کند:

    ~/return_values.sh
    #!/bin/bash
    
    my_function () {
      local func_result="some result"
      echo "$func_result"
    }
    
    func_result="$(my_function)"
    echo $func_result
    
    some result
    

    به جای اجرای ساده تابعی که پیام را در آن چاپ می کند stdout، خروجی تابع را به func_result متغیر با استفاده از $() تعویض فرمان متغیر بعداً می تواند در صورت نیاز مورد استفاده قرار گیرد.

پیشنهاد می‌کنیم بخوانید:  Nginx را با Let's Encrypt روشن کنید CentOS 7

انتقال آرگومان ها به توابع

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

function_name arg1 arg2 arg3

متغیرهای ویژه

  • پارامترهای موقعیت $1، $2، $3$n، با موقعیت پارامتر بعد از نام تابع مطابقت دارد.
  • را $0 متغیر برای نام تابع رزرو شده است.
  • را $# متغیر تعداد پارامترهای موقعیتی/آگومان های ارسال شده به تابع را نگه می دارد.
  • را $* و $@ متغیرها همه پارامترها/آرگمون های موقعیتی ارسال شده به تابع را در خود نگه می دارند.
    • وقتی دو نقل قول می شود، "$*" به یک رشته منفرد جدا شده با فاصله (نخستین کاراکتر IFS) گسترش می یابد – "$1 $2 $n".
    • وقتی دو نقل قول می شود، "$@" به رشته های جداگانه گسترش می یابد – "$1" "$2" "$n".
    • وقتی دو نقل قول نمی شود، $* و $@ یکسان هستند.

در اینجا یک مثال است:

~/passing_arguments.sh
#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Zoe"
Hello Zoe

نتیجه گیری

تابع Bash بلوکی از کد قابل استفاده مجدد است که برای انجام یک عملیات خاص طراحی شده است. پس از تعریف، تابع را می توان چندین بار در یک اسکریپت فراخوانی کرد.

توابع به ویژه برای تکرار کارها، ساده کردن اسکریپت های پیچیده و ایجاد کد قابل خواندن و ماژولار مفید هستند.

همچنین می توانید در مورد روش استفاده از یک تابع Bash برای ایجاد یک دستور میانبر به یاد ماندنی (نام مستعار) برای یک فرمان طولانی تر بخوانید.

اگر سوال یا بازخوردی دارید، در کامنت بگذارید.

bash
terminal
برای نگارش بخشهایی از این متن ممکن است از ترجمه ماشینی یا هوش مصنوعی GPT استفاده شده باشد
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم

زمان انتشار: 1404-12-16 15:22:06

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید