Md Daily – Telegram
Md Daily
729 subscribers
239 photos
15 videos
21 files
283 links
راجب مقالات و مستندات فنی یا غیر فنی که میخونم و علایقم اینجا مینویسم :)


گروه کانال: https://news.1rj.ru/str/MdDailyGap

کورس ها: https://news.1rj.ru/str/MdDaily/395

وبلاگ: https://mddaily.ir
Download Telegram
#ام_دی_کورس

دستورات شرطی (if-else و case) در Bash

در این بخش از مجموعه آموزش bash، نحوه استفاده از دستورات شرط های تو در تو، if-else و case در اسکریپت های bash را یاد میگیریم.

وقتش شده که اسکریپت های bash امون رو باهوش کنیم :)

با یادگیری دستورات شرطی و مثال های عملی و کاربردی که توی این بخش زده میشه شما میتونید اسکریپت های bash بسیار کارآمدتری بنویسید

استفاده از دستور if در bash

اساسی ترین سازه در هر ساختار تصمیم گیری، شرط if است. نحو کلی یک دستور if:

if [ condition ]; then
your code
fi

دستور if با fi (معکوس if) بسته میشه.

❗️به فضای خالی توجه کنید!

👈 باید بین براکت های باز و بسته و شرطی که می نویسید یک فاصله وجود داشته باشه. در غیر این صورت، Shell بهتون کلی خطا میده

👈 باید قبل و بعد از عملگر شرطی (=، ==، <= و غیره) فاصله وجود داشته باشه. در غیر این صورت، خطایی مانند "unary operator expected" خواهید دید.

حالا بیایید یک اسکریپت نمونه بنام root.sh ایجاد کنیم. این اسکریپت عبارت "شما root هستید" را فقط در صورتی که اسکریپت را به عنوان کاربر root اجرا کنید، چاپ میکنه:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
echo "You are root"
fi

دستور whoami نام کاربری رو خروجی میده. از آموزش متغیرهای bash، می دانیم که $(command) برای Command Substitution استفاده میشه و خروجی دستور را به شما میده.

شرط $(whoami) = 'root' فقط در صورتی درسته که شما به عنوان کاربر root وارد شده باشید.

ادامه در پست بعدی...

🆔 @MdDaily
1🔥1
#ام_دی_کورس

استفاده از دستور if-else در bash

وقتی اسکریپت root.sh را به عنوان یک کاربر معمولی اجرا می کنید، هیچ خروجی دریافت نمی کنید. هر کدی که می خواهید هنگام ارزیابی شرط if به عنوان false اجرا شود، میتونه در یک دستور else قرار بگیره:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi


حالا اگه اسکریپت رو به عنوان یک کاربر معمولی اجرا کنید، به شما میگه که شما کاربر root نیستید:

linux@ubuntu:~$ ./root.sh
You are not root

استفاده از دستور else if در bash

هر زمان که می خواهید بیش از یک عبارت (شرط) را به طور همزمان آزمایش کنید، میتونید از دستور else if استفاده کنید.

به عنوان مثال، اسکریپت age.sh زیر سن شما را به عنوان آرگومان می گیره و پیام معنی داری را متناسب با سن شما خروجی میده:

#!/bin/bash

AGE=$1

if [ $AGE -lt 13 ]; then
echo "You are a kid."
elif [ $AGE -lt 20 ]; then
echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
echo "You are an adult."
else
echo "You are an elder."
fi

همچنین توجه داشته باشید که میتونید چندین دستور elif داشته باشید اما فقط یک دستور else در یک ساختار if داشته باشید و باید با fi بسته بشه.

استفاده از ifهای تودرتو در bash

شما همچنین میتونید از یک دستور if در داخل دستور if دیگری استفاده کنید. به عنوان مثال، به اسکریپت زیر weather.sh نگاه کنید:

#!/bin/bash

TEMP=$1

if [ $TEMP -gt 5 ]; then
if [ $TEMP -lt 15 ]; then
echo "The weather is cold."
elif [ $TEMP -lt 25 ]; then
echo "The weather is nice."
else
echo "The weather is hot."
fi
else
echo "It's freezing outside ..."
fi

اسکریپت دما رو به عنوان آرگومان می گیره و بعدش پیامی را نشون میده که منعکس کننده آب و هواست. اگه دما بیشتر از پنج باشد، دستور if-elif تو در تو (درونی) ارزیابی میشه. بیایید چند بار اسکریپت را اجرا کنیم تا ببینیم چگونه کار می کند:

linux@ubuntu:~$ ./weather.sh 0
It's freezing outside ...
linux@ubuntu:~$ ./weather.sh 8
The weather is cold.
linux@ubuntu:~$ ./weather.sh 16
The weather is nice.
linux@ubuntu:~$ ./weather.sh 30
The weather is hot.

استفاده از دستور case در bash

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

case "variable" in
"pattern1" )
Command … ;;
"pattern2" )
Command … ;;
"pattern2" )
Command … ;;
esac

❗️ توجه داشته باشید!

👈 الگوها همیشه با یک فضای خالی و ) دنبال میشن.

👈دستورات همیشه با دو نقطه ویرگول ;; دنبال میشن. فضای خالی قبلش اجباری نیست.

👈 دستورات case با esac (معکوس case) تموم میشن.

دستورات case به ویژه وقتی که با الگو ها یا عبارات منظم سروکار دارید مفید هستند. برای نشون دادن این مورد به اسکریپت زیر char.sh نگاه کنید:

#!/bin/bash

CHAR=$1

case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac


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

linux@ubuntu
:~$ ./char.sh a
Small Alphabet.
linux@ubuntu
:~$ ./char.sh Z
Big Alphabet.
linux@ubuntu
:~$ ./char.sh 7
Number.
linux@ubuntu
:~$ ./char.sh $
Special Character.


توجه داشته باشید که از نماد ستاره (*) برای تعریف حالت پیش فرض استفاده کردم که معادل دستور else در یک شرط if هستش.

ادامه در پست بعدی...

🆔 @MdDaily
❤‍🔥21🔥1
#ام_دی_کورس

تست conditions در bash

در بش condition های زیادی وجود داره که میتونید تو دستور if استفاده کنید. شرایط بسته به اینکه با اعداد، رشته‌ها یا فایل‌ها کار می‌کنید متفاوته ولی میشه بهشون به عنوان عملگر های منطقی نگاه کرد

برخی از محبوب ترین conditions ها رو تو جدول تصویر پست اوردم.

خوشبختانه، نیازی به حفظ هیچ یک از اینا ندارید، چونکه میتونید این ها رو در صفحه راهنمای test جستجو کنید:

linux@ubuntu:~$ man test

ادامه در پست بعدی...

🆔 @MdDaily
2❤‍🔥1
Md Daily
#ام_دی_کورس تست conditions در bash در بش condition های زیادی وجود داره که میتونید تو دستور if استفاده کنید. شرایط بسته به اینکه با اعداد، رشته‌ها یا فایل‌ها کار می‌کنید متفاوته ولی میشه بهشون به عنوان عملگر های منطقی نگاه کرد برخی از محبوب ترین conditions…
#ام_دی_کورس

بیایید به عنوان آخرین اسکریپت مبحث دستورات شرطی یک اسکریپت به نام filetype.sh ایجاد کنیم که تشخیص بده آیا یک فایل یک فایل معمولیه، دایرکتوریه یا soft link :

#!/bin/bash

if [ $# -ne 1 ]; then
echo "Error: Invalid number of arguments"
exit 1
fi

file=$1

if [ -f $file ]; then
echo "$file is a regular file."
elif [ -L $file ]; then
echo "$file is a soft link."
elif [ -d $file ]; then
echo "$file is a directory."
else
echo "$file does not exist"
fi

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

بیایید چند بار اسکریپت را برای تست آن با انواع مختلف فایل اجرا کنیم:

linux@ubuntu:~$ ./filetype.sh weather.sh
weather.sh is a regular file.

linux@ubuntu:~$ ./filetype.sh /bin
/bin is a soft link.

linux@ubuntu:~$ ./filetype.sh /var
/var is a directory.

linux@ubuntu:~$ ./filetype.sh
Error: Invalid number of arguments


🏆 نکات تکمیلی: دستور if else در یک خط

تا کنون تمام عبارات if else ای که دیدید در یک اسکریپت bash مناسب استفاده شده بودن. این یه روش منطقی و مناسبه، ولی شما مجبور نیستید ازش استفاده کنید

وقتی که فقط میخواین نتیجه رو تو shell ببینید، میتونید از عبارات if else در یک خط در bash استفاده کنید.

فرض کنید این اسکریپت bash را دارید:

if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi

میتونید از تمام عبارات if else در یک خط مثله این استفاده کنید:

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi


در اصل، شما فقط بعد از دستورات semicolon اضافه می کنید و بعدش دستور if-else بعدیو مینویسید.


ادامه در پست بعدی...

🆔 @MdDaily
2❤‍🔥1🔥1
#ام_دی_کورس

حلقه ها در Bash

حلقه ها برای هر زبان اسکریپتی ضروری هستن. بریم که تو این بخش از آموزش Bash حلقه های for، while و until را با مثال های کاربردی یاد بگیریم

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

علاوه بر این، از عبارات break و continue برای کنترل حلقه ها استفاده میکنیم رو و در نهایت نحوه ایجاد حلقه های بی نهایت را یاد میگیریم :)

حلقه های For در Bash

💡 حلقه های For یکی از سه نوع ساختار حلقه ای هستند که میتونید در bash استفاده کنید. دو سبک مختلف برای نوشتن حلقه for وجود داره:

👈 حلقه های for به سبک C
👈استفاده از حلقه for در لیست/رنج آیتم ها


حلقه های For به سبک C یا همون C-style در Bash

اگه با یه زبان برنامه نویسی مثل C یا C++ آشنا هستید، پس سینتکس حلقه for زیر برای شما آشناس:

for ((initialize ; condition ; increment)); do
[COMMANDS]
done

با استفاده از سینتکس به سبک C فوق، حلقه for زیر ده بار عبارت "Hello Friend" رو چاپ میکنه:

for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done

حلقه for ابتدا متغیر عدد صحیح i را به صفر مقداردهی میکنه، بعد شرط (i <10) را آزمایش می کنه. اگه درست بود، حلقه خط echo “Hello Friend” رو اجرا می کنه و متغیر i رو 1 واحد افزایش میده، و سپس حلقه دوباره و دوباره اجرا میشه تا زمانی که i دیگر کمتر از 10 نباشه.

حلقه های For لیست/رنج(List/Range) در Bash

نوع دیگری از سینتکس حلقه for نیز وجود دارد که به ویژه در صورت کار با لیستی از فایل ها (یا رشته ها)، محدوده اعداد، آرایه ها، خروجی یک دستور و غیره مفیده. سینتکس حلقه for لیست/رنج به صورت زیر هست:
for item in [LIST]; do
[COMMANDS]
done


برای مثال، حلقه for زیر دقیقا همان کاری رو انجام میده که حلقه for به سبک C که در بخش قبلی ایجاد کردیم انجام میده:

for i in {1..10}; do
echo "Hello Friend"
done

اسکریپت var.sh زیر تمام فایل ها و دایرکتوری هایی رو که در زیر دایرکتوری /var وجود دارند رو نمایش میده:

#!/bin/bash

for i in /var/*; do
echo $i
done


نمونه خروجی هنگام اجرای اسکریپت var.sh:

linux@ubuntu:~$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp

ادامه در پست بعدی...

🆔 @MdDaily
❤‍🔥11
#موقت

با اپدیت کردن تلگرام دسکتاپتون به Beta با ویژگی code block میتونید بدون مشکل کد های استفاده شده توی آموزش رو کپی و مطالعه کنید :)
❤‍🔥2👌1
Md Daily
#ام_دی_کورس حلقه ها در Bash حلقه ها برای هر زبان اسکریپتی ضروری هستن. بریم که تو این بخش از آموزش Bash حلقه های for، while و until را با مثال های کاربردی یاد بگیریم تو این قسمت از آموزش، سه ساختار مختلف حلقه bash رو بررسی میکنیم. همچنین از حلقه ها برای…
#ام_دی_کورس

حلقه‌های While در Bash

حلقه While یکی دیگر از حلقه‌های محبوبه که میتونید در اسکریپت‌های bash استفاده کنید. نحو کلی برای یک حلقه while:

while [ condition ]; do
[COMMANDS]
done

به عنوان مثال، اسکریپت 3x10.sh زیر از یک حلقه While استفاده میکنه که ده مضرب اول عدد سه را چاپ میکنه:

#!/bin/bash

num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done

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

linux@ubuntu:~$ ./3x10.sh
3
6
9
12
15
18

ابتدا متغیر num را با 1 مقداردهی اولیه میکنه. بعدش، حلقه While تا زمانی که num کمتر یا مساوی 10 باشه اجرا میشه. در داخل بدنه حلقه while، دستور echo مقدار num ضرب شده در 3 را چاپ میکنه و بعدش num را یکی افزایش میده.

حلقه های Until در Bash

اگه قبلا با حلقه ها در بقیه ی زبان های برنامه نویسی کارد کرده باشید، احتمالا به دنبال حلقه do-while در bash هستید، اما این اینجا وجود نداره.

نوع دیگه ای از حلقه در bash وجود داره. حلقه until که سینتکسش مشابه حلقه while هست:
until [ condition ]; do
[COMMANDS]
Done

تفاوت کلیدی بین حلقه until و حلقه while در condition عه. یه حلقه while تا زمانی که condition یا همون شرط true باشه اجرا میشه ولی یه حلقه until تا زمانی که condition یا همون شرط false باشد، اجرا میشه!

به عنوان مثال، میشه به راحتی اسکریپت 3x10.sh را با یک حلقه until به جای یک حلقه while بازنویسی کرد:

#!/bin/bash

num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done

توجه داشته باشید که نفی شرط [ $num -le 10 ]; در اینجا[ $num -gt 10 ]; هستش.

ادامه در پست بعدی...

🆔 @MdDaily
❤‍🔥11
Md Daily
#ام_دی_کورس حلقه‌های While در Bash حلقه While یکی دیگر از حلقه‌های محبوبه که میتونید در اسکریپت‌های bash استفاده کنید. نحو کلی برای یک حلقه while: while [ condition ]; do [COMMANDS] done به عنوان مثال، اسکریپت 3x10.sh زیر از یک حلقه While استفاده میکنه…
#ام_دی_کورس

چاپ محتوای یک آرایه در bash

حلقه‌های For اغلب محبوب‌ترین انتخاب برای تکرار عناصر آرایه هستند.

به عنوان مثال، اسکریپت prime.sh زیر بر روی هر عنصر در آرایه prime تکرار میشه و چاپش میکنه:
#!/bin/bash

prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done

نمونه خروجی:

linux@ubuntu:~$ ./prime.sh
2
3
5
7

استفاده از Break و Continue در حلقه های bash

گاهی اوقات ممکنه بخواهید یک حلقه را زودتر از موعد خاتمه دهید یا یک تکرار حلقه را رد کنید. برای انجام این کار، میتونید از دستورهای break و continue استفاده کنید.

دستور break اجرای یک حلقه را خاتمه میده و کنترل برنامه را به دستور یا دستورالعمل بعدی پس از حلقه تبدیل میکنه.

به عنوان مثال، حلقه زیر فقط اعداد یک تا سه را چاپ می‌کند:

for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done

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

به عنوان مثال، اسکریپت odd.sh زیر فقط اعداد فرد از یک تا ده را چاپ می‌کند، زیرا همه اعداد زوج را نادیده می‌گیرد:

#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done

نمونه خروجی:

linux@ubuntu:~$ ./odd.sh
1
3
5
7
9

حلقه‌های بی‌نهایت در bash

یک حلقه بی‌نهایت حلقه‌ای است که برای همیشه اجرا می‌شود. این زمانی اتفاق می‌افتد که شرط حلقه همیشه true باشد.

در اکثر موارد، حلقه های بی نهایت محصول خطای منطقی انسان هستند.

به عنوان مثال، کسی که ممکن است بخواهد حلقه ای ایجاد کند که اعداد 1 تا 10 را به ترتیب نزولی چاپ کند، ممکن است به اشتباه حلقه بی نهایت زیر را ایجاد کند:

for ((i=10;i>0;i++)); do
echo $i
done

مشکل این است که حلقه متغیر i را به اندازه 1 افزایش می دهد. برای رفع آن، باید i++ را با i-- به صورت زیر تغییر دهید:

for ((i=10;i>0;i--)); do
echo $i
done

در برخی موارد، ممکن است بخواهید به طور عمدی حلقه های بی نهایت ایجاد کنید تا منتظر انجام یک condition خارجی یا همون external در سیستم باشید. می توانید به راحتی یک حلقه for بی نهایت به صورت زیر ایجاد کنید:

for ((;;)); do
[COMMANDS]
done

اگر می خواهید به جای آن یک حلقه while بی نهایت ایجاد کنید، می توانید آن را به صورت زیر ایجاد کنید:

while [ true ]; do
[COMMANDS]
done

ادامه در پست بعدی...

🆔 @MdDaily
❤‍🔥11
#ام_دی_کورس

استفاده از توابع در Bash

هیچ کدی رو دوباره ننویس، از تابع استفاده کن!

وقتی کدهای bashت بزرگ و بزرگ میشن، همه چی میتونه درهم و برهم بشه!

ممکنه ببینی که یه سری کد رو بارها و بارها تو قسمت های مختلف کد bashت دوباره مینویسی.

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

تو این آموزش، یاد میگیریم که چطور تابع بسازیم، مقدار تابع رو برگردونیم، و آرگومان تابع رو تو اسکریپت های bash پاس بدیم.

علاوه بر این، یاد می‌گیریم که اسکوپ متغیرها(variables scope) چطور کار می‌کنه و چطور توابع بازگشتی رو تعریف کنیم.

ایجاد توابع در Bash

دو سینتکس مختلف برای ایجاد تابع bash وجود داره. سینتکس زیر رایج ترین روش ایجاد تابع bash هست:
function_name () {
commands
}

روش دوم و کمتر رایج برای ایجاد تابع bash با کلمه کلیدی function شروع میشه و به دنبال اون نام تابع به صورت زیر هست:

function function_name {
commands
}

حالا چند نکته مهم وجود داره که باید هنگام کار با توابع به اونها توجه کنیم:

👈یک تابع توابع هرگز اجرا نمیشه مگر اینکه تابع فراخوانی بشه.
👈تعریف تابع باید قبل از هر فراخوانی به تابع باشه.

هر وقت که بخواهیم تابعی اجرا بشه، فقط کافیه اون رو فراخوانی کنیم! فراخوانی تابع صرفا با اشاره به نام تابع انجام میشه.

به اسکریپت fun.sh زیر نگاه کنید:

#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello

من تو این اسکریپت، تابعی به اسم hello تعریف کردم که به سادگی خط "Hello World" رو تو ترمینال نشون میده. توجه کنید که من سه بار تابع hello رو صدا زدم و بنابراین اگر اسکریپت رو اجرا کنیم، خط "Hello World" سه بار روی صفحه چاپ می‌شه:

linux@ubuntu:~$ ./fun.sh
Hello World
Hello World
Hello World

ادامه در پست بعدی...

🆔 @MdDaily
❤‍🔥11👍1
Md Daily
#ام_دی_کورس استفاده از توابع در Bash هیچ کدی رو دوباره ننویس، از تابع استفاده کن! وقتی کدهای bashت بزرگ و بزرگ میشن، همه چی میتونه درهم و برهم بشه! ممکنه ببینی که یه سری کد رو بارها و بارها تو قسمت های مختلف کد bashت دوباره مینویسی. خوشبختانه، میتونی…
#ام_دی_کورس

بازگشت مقادیر تابع در Bash

💡 در بسیاری از زبان‌های برنامه‌نویسی، توابع هنگام صدا زدن مقداری رو برمی‌گردونند. اما این مورد در Bash صدق نمی‌کنه! چون توابع Bash مقادیری رو برنمی‌گردونند.

وقتی اجرای یک تابع Bash به پایان می‌رسه، وضعیت خروج آخرین دستور اجرا شده که در متغیر $? ذخیره شده است رو برمی‌گردونه. صفر نشان‌دهنده اجرای موفقیت‌آمیز یا یک عدد صحیح مثبت غیر صفر (1-255) برای نشان‌دادن شکست است.

می‌تونید از دستور return برای تغییر وضعیت خروج تابع استفاده کنید. برای مثال، به اسکریپت error.sh زیر نگاه کنید:

#! /bin/bash

error () {
blabla
return 0
}

error
echo "The return status of the error function is: $?"

اگر اسکریپت error.sh رو اجرا کنید، ممکنه از خروجی تعجب کنید:

linux@ubuntu:~$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0


بدون دستور return 0، تابع error هرگز وضعیت خروج غیر صفر رو برنمی گردونه زیرا blabla منجر به خطای command not found می شه.

همچنین باید توجه داشته باش که دستور return بلافاصله یک تابع رو خاتمه می ده.

ادامه در پست بعدی...

🆔 @MdDaily
❤‍🔥11
Md Daily
#ام_دی_کورس بازگشت مقادیر تابع در Bash 💡 در بسیاری از زبان‌های برنامه‌نویسی، توابع هنگام صدا زدن مقداری رو برمی‌گردونند. اما این مورد در Bash صدق نمی‌کنه! چون توابع Bash مقادیری رو برنمی‌گردونند. وقتی اجرای یک تابع Bash به پایان می‌رسه، وضعیت خروج آخرین…
#ام_دی_کورس

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

می‌تونیم آرگومان‌ها رو به یه تابع درست مثل آرگومان‌هایی که به یه اسکریپت bash می‌فرستیم، بفرستیم. فقط آرگومان‌ها رو موقع فراخوانی تابع وارد می‌کنیم.

برای نشون دادنش توی عمل، بیایید نگاهی به اسکریپت iseven.sh زیر بندازیم:

#!/bin/bash

iseven () {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 is even."
else
echo "$1 is odd."
fi
}

iseven 3
iseven 4
iseven 20
iseven 111

تابع iseven() تست می‌کنه که یه عدد زوجه یا فرد. من چهار فراخوانی تابع برای iseven() انجام دادم. برای هر فراخوانی تابع، من یه عدد رو ارائه دادم

بیایید اسکریپت iseven.sh رو اجرا کنیم تا مطمئن بشیم که کار می‌کنه:

linux@ubuntu:~$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.

همچنین باید به خوبی آگاه باشیم که آرگومان‌های تابع bash و آرگومان‌های اسکریپت bash دو چیز متفاوت هستند. برای مقایسه تفاوت، نگاهی به اسکریپت funarg.sh زیر بندازیم:

#!/bin/bash

fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}

echo "$1 is the first argument to the noscript."
echo "$2 is the second argument to the noscript."

fun Yes 7

اسکریپت رو با چند آرگومان اجرا میکنیم و نتیجه:

linux@ubuntu:~$ ./funarg.sh Cool Stuff

Cool is the first argument to the noscript.

Stuff is the second argument to the noscript.

Yes is the first argument to fun()7 is the second argument to fun()


همانطور که می‌بینید، حتی اگر از همون متغیرهای $1 و $2 برای اشاره به آرگومان‌های اسکریپت و آرگومان‌های تابع استفاده بشه، آنها نتایج متفاوتی رو هنگام فراخوانی از داخل یه تابع تولید می‌کنن.

ادامه در پست بعدی...

🆔 @MdDaily
1❤‍🔥1👏1
Md Daily
#ام_دی_کورس ارسال آرگومان به تابع bash می‌تونیم آرگومان‌ها رو به یه تابع درست مثل آرگومان‌هایی که به یه اسکریپت bash می‌فرستیم، بفرستیم. فقط آرگومان‌ها رو موقع فراخوانی تابع وارد می‌کنیم. برای نشون دادنش توی عمل، بیایید نگاهی به اسکریپت iseven.sh زیر…
#ام_دی_کورس

متغیرهای محلی(Local) و سراسری(global) در توابع bash

متغیرهای bash می‌تونن دو تا دامنه داشته باشن: global و Local. متغیرهای global رو میشه از هر جای یه اسکریپت bash بهشون دسترسی داشت، اما متغیرهای Local فقط از داخل تابعی که تعریف شدن قابل دسترسی هستن.

برای مثال، به اسکریپت bash زیر نگاه کنید:

#!/bin/bash

v1='A'
v2='B'

myfun() {
local v1='C'
v2='D'
echo "Inside myfun(): v1: $v1, v2: $v2"
}

echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"

ابتدا دو متغیر سراسری v1 و v2 تعریف کردم. سپس در داخل تعریف myfun()، از کلمه کلیدی local برای تعریف یک متغیر محلی v1 و تغییر متغیر سراسری v2 استفاده کردم. توجه داشته باشید که میتونید از یک نام متغیر برای متغیرهای محلی در توابع مختلف استفاده کنید.

حالا بیایید اسکریپت را اجرا کنیم:
linux@ubuntu:~$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D

از خروجی اسکریپت، میشه موارد زیر را نتیجه گرفت:

👈یک متغیر محلی که نامی مشابه یک متغیر سراسری دارد، بر متغیرهای سراسری در داخل بدنه تابع اولویت خواهد داشت.

👈میشه یک متغیر سراسری را از داخل یک تابع تغییر داد.

ادامه در پست بعدی...

🆔 @MdDaily
👍2❤‍🔥11
Md Daily
#ام_دی_کورس متغیرهای محلی(Local) و سراسری(global) در توابع bash متغیرهای bash می‌تونن دو تا دامنه داشته باشن: global و Local. متغیرهای global رو میشه از هر جای یه اسکریپت bash بهشون دسترسی داشت، اما متغیرهای Local فقط از داخل تابعی که تعریف شدن قابل دسترسی…
#ام_دی_کورس

توابع بازگشتی(Recursive functions)

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

تابع فاکتوریل یه مثال کلاسیک از یه تابع بازگشتی هست. به اسکریپت bash زیر نگاه کن:

#!/bin/bash

factorial () {
if [ $1 -le 1 ]; then
echo 1
else
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
fi
}

echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6

هر تابع بازگشتی باید با یک مورد پایه(base case) شروع شود که برای پایان دادن به زنجیره فراخوانی های تابع بازگشتی ضروری است. در تابع factorial()، مورد پایه به صورت زیر تعریف شده است:

if [ $1 -le 1 ]; then
echo 1

اکنون مورد بازگشتی را برای تابع فاکتوریل استخراج کنید. برای محاسبه فاکتوریل یک عدد n که n یک عدد مثبت بزرگتر از یک است، می توانید n را در فاکتوریل n-1 ضرب کنید:

factorial(n) = n * factorial(n-1)

بیایید از معادله بالا برای نوشتن این مورد بازگشتی استفاده کنیم:

last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))

حالا اسکریپت را اجرا میکنیم تا مطمئن بشیم که نتایج درست هستند:

linux@ubuntu:~$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720

ادامه در پست بعدی...

🆔 @MdDaily
2❤‍🔥1
#ام_دی_کورس

فایل های تمرینی مباحث دوره ی Bash 👇👇👇
1