Shell Scripting

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

قسمت اول :

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

ساختار :
همیشه با خط زیر شروع میشود

#!/bin/bash

یعنی فایل شما نیاز داره برای اجرا شدن از بش در ترمینال استفاده کنه.
نکته: (اگر شما از فریم ورک zsh یا fish استفاده میکنید لازمه که bash را با zsh یا … جایگزین کنیم)
خوب بیاید یه برنامه کوچیک بنویسیم.
همونطور که گفتم (یک توالی از دستورات بش هست) و برای پرینت کردن یک متن توی ترمینال از دستور echo استفاده میشود . مثل دستور زیر:

echo "Hello World!"

اما میتونیم روی رنگ و بک گراند نوشتمون کار کنیم تا یکمی کاربر پسند تر باشه ! برای این میتونیم از

"\e[0;Xm"

در کدمون استفاده کنیم. فقط باید X را با اعداد جایگرین کنیم .
اما اگر بخواهیم نوشته به صورت Bold نمایش داده بشه باید 0 را با 1 جایگزین کنیم.
برای مثال :

echo "\e[1;5mHello\ World! \e[0m" 

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

جمله Hello World رو به صورت چشمک زن و Bold نمایش میده.

اما بیاید کمی پیش تر بریم و چند دستور دیگر هم اضافه کنیم
دستور whoami یوزر کاربر را در ترمینال چاپ میکنه .

#!/bin/bash
echo "\e[0;5mHello World!\e[0m" 
echo "\e[0;41mMy name is:\e[0m \e[0;2m"
whoami

خوب الان زمان اینه که فایل برنامه را سیو کنیم . برای اینکار باید برنامه با پیشوند

.sh

ذخیره کنیم . من اسم فایلم رو میزارم simple.sh و بعد از این باید به برنامه مجوز اجرا شدن رو هم بدیم و الا برنامه ما اجرا نمیشه!
با دستور زیر :

chmod +x simple.sh

فایل الان مجوز اجرا شدن رو داره یا به اصطلاع executable شده
برای اجرای برنامه میتونیم به طریقه زیر عمل کنیم :

./simple.sh

که . اینجا اشاره داره به پوشه ای که در حال حاضر داخلش هستیم همان پوشه home و فایل برنامه . مثلا اگه من بخوام از یک پوشه دیگه این فایل رو اجرا کنم باید کل آدرس را تایپ کنم به این صورت:

/home/USER/simple.sh

یا خلاصه تر :

~/simple.sh

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

bash1

4 Likes

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

یه ابزار کامندلاینه که احتمالا با پکیج‌منیجر سیستمتون میتونید نصبش کنید. یه وبسایت هم داره برای تست‌ آنلاین؛

اینم گیتهابش:

5 Likes

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

نکات و جزئیات خیلی زیادی وجود دارد که اکثر زمان ها رعایت نمیکنیم و چنین ابزار هایی به خوبی می توانند ایرادات کل اسکریپت را بررسی و حتی توضیح خوبی هم برای حل اونها ارائه دهند.
یک نمونه بخواهم ذکر کنم:

روش بد:
[[ … && … ]]
روش بهتر:
[[ … ]] && [[ … ]]

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

یا اینکه ${...} چنین چیزی در Posix نداریم.

درسته فرق زیادی بین این دو مورد در مقال فوق نیست اما اینها را زمانی بهتر درک میکنیم که بخواهیم اسکریپت را در محیط های مختلفی اجرا کنیم.
این مورد عمدتا در مورد مسیر هایی که در اسکریپت های لینوکسی وجود دارد هم صحیح است زیرا برخی از میسر هایی استفاده می کنند که تنها در سیستم های لینوکسی است و در سیستم های Unix-LIKE و حتی FreeBSD وجود ندارند.

بین یک اسکریپتی که نوشته شده است و کار میکند و یک اسکریپتی که طبق POSIX است فاصله زیادی است.
بسیاری از افراد با اینکه تنها با BASH اندک تجربه ای دارد انها را در رزومه هایشان ذکر میکنند در صورتی که کوچک ترین تجربه ای در BASH و استاندارد ها و محیط های POSIX نداریم.

باتشکر

3 Likes

البته فقط این نیست.
چیز های دیگه هم مثل حلقه ی for و دستور شرطی if هم داره

سلام بله بنده هم نوشتم قسمت اول اما هنوز نتونستم ادامه بدم . ایشالله یکم از مشکلاتم کم شد حتما ادامه رو قرار میدم . یا اگر شما وقت دارید همین موضوع یا هر موضوعی که توی ذهن شماست بنویسید تا اگر کسی عضو این انجمن نیست هم بتونه استفاده کنه