درآمدی بر Shell Scripting و Bash Scripting

امروزه آشنایی و مهارت کافی در Shell Scripting برای یک کاربر حرفه ای، برنامه نویس یا مدیر سیستم بسیار مهم و اساسی است و به کمک آن می توان به طور موثر و کارآمد نیازها یا چالش های جدید را مرتفع سازد.

بیشتر سیستم عامل ها دارای دستورهای فراوانی برای اجرای فرامین کاربر می باشند و کاربران گاهی نیاز دارند ترکیبی از دستورات، با ترتیب مورد نظر را اجرا نمایند. به این منظور از اسکریپت نویسی شِل استفاده می شود. اسکریپت شِل یک فایل متنی اجرایی شامل دستورات، پارامترها و کامنت‌ها می‌باشد. دستورات در اسکریپت‌ها، خط به خط توسط مفسر اجرا می‌گردند. در سیستم عامل های ماکروسافت به این فایل‌ها Batch file یا فایل‌های دسته‌ای گفته می‌شود. در کامپیوترهای مین‌فریم IBM با سیستم عاملVM به این نوع فایل‌ها EXEC می‌گفتند و در لینوکس هم آن ها را عموماً Bash Script می نامیم.

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

بهتر است قبل از آشنایی و شروع به کار با Shell Scripting ابتدا با مفهموم Shell آشنا شویم.

مفهوم Shell

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

معماری سیستم عامل
معماری سیستم عامل

کرنل (Kernel ) در واقع هسته یا پایین ترین لایه سیستم عامل از نظر نزدیکی به سخت افزار است. سایر قسمت های سیستم عامل اعم از رابط گرافیکی، مدیریت فایل ها، Shell ، نرم افزار ها و ... وابستگی کاملی به Kernel دارند.

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

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

اگر شما سیستم عاملی داشته باشید که فاقد Shell باشد، این سیستم عامل فقط و فقط می تواند کارهایی که از پیش برایش تعریف شده اند را انجام دهد و به هیچ عنوان نمی تواند به دیگر درخواست های کاربران پاسخ دهد زیرا رابط کاربری یا Shell ای وجود ندارد که بتواند با Kernel از لحاظ گرافیکی و یا از طریق خط فرمانی ارتباط برقرار کند.
شل ها یا به صورت رابط خط دستور Command-line Interface (CLI) و یا به صورت رابط گرافیکی Graphical User Interface (GUI) می باشند.

در سیستم عامل ویندوز Shell مورد استفاده Command Prompt یا همان CMD می باشد. ( از ویندوز 7 به بعد PowerShell هم اضافه شده است ) به علت وجود یک رابط کاربری فوق العاده در ویندوز، معمولاً کاربران از دستورات استفاده نمی کنند. ولی در سیستم­های تحت لینوکس در صورت نصب مینیمال، رابط گرافیکی وجود ندارد و کاربران آن بیشتر با دستورات در ارتباط هستند، همچنین در صورت استفاده از رابط گرافیکی در لینوکس می توان با نرم افزاری به نام ترمینال به شل کامند لاینی دسترسی داشت .

GUI vs CLI
GUI vs CLI

‌ اما جالب است بدانید که در گذشته سیستم عامل های همگی تنها یک user interface داشتن که CLI بود. به عنوان مثال یونیکس و سیستم های بعد از آن مانند لینوکس. همچنین سیستم عامل معروف ماکروسافت قبل از توسعه ویندوز Ms-Dos بود که فقط از یک رابط کاربری کامند لاینی بهره می برد.

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

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

اما فراتر از سادگی و کار آمد بودن ویژگی مهم دیگر Shell ها قابل برنامه ریزی بودن آنهاست.

شل اسکریپتنیگ (Shell Scripting)

Shell Scripting
Shell Scripting

مواردی پیش می آید که شما می بایست دستوراتی تکراری را بارها و بارها تایپ و اجرا کنید. این کار وقت زیادی از شما می گیرد. مهم این است هر زمان که برای بار دوم کاری انجام می­دهید از خود بپرسید که "آیا نمی توانم برنامه ای بنویسم که این کار را برای من انجام دهد؟"

به عبارت دیگر Shell یک زبان برنامه نویسی است که به طور خاص برای کار با دستورات سیستم عامل رایانه شما طراحی شده است. شما می­توانید چندین دستور را با استفاده از یک برنامه ساده، در یک فایل متنی ذخیره کنید و با هر بار اجرای آن فایل، همه دستورات مورد نظر شما اجرا شود. به این برنامه نویسی، برنامه نویسی شل (Shell Programming) و به فایل تولید شده اسکریپت شل (Shell Script) گفته می­شود.

اسکریپت نویسی در لینوکس، کارها را بسیار آسان کرده و سرعت کارها را بالا می برد، به عنوان مثال اگر می خواهید تعداد زیادی فایل WAV را به MP3 تبدیل کنید ، یا اگر می ­خواهید تمام فایل ها یا فولدرها را فشرده کنید، می­توانید یک Shell script برای انجام آن بنویسید.

در واقع هر زمان که خود را مکرراً در حال انجام کاری می بینید ، باید سعی کنید با نوشتن یک Shell script آن عملیات را خودکار کنید.

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

برخی از مزایایShell Script :

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

انواع شل های کامندلاینی در لینکوس

Types of Shells in Linux
Types of Shells in Linux

اکثر توزیع های لینوکس با Shell های زیادی تولید می شوند.

هر Shell ویژگی های خاص خود را دارد و برخی از آنها امروزه بین کاربران و برنامه نویسان بسیار محبوب هستند. در اینجا به تعدادی از آنها اشاره می کنیم:

1. پوسته Sh: این پوسته Bourne نامیده می شود ، در دهه 70 میلادی توسط شخصی به نام استفان بورن ساخته شد. این پوسته امکانات زیادی را ارائه می دهد.

2. پوسته Bash: پوسته (Bourne again shell) نیز نامیده می شود ، این پوسته محبوبترین پوسته لینوکس است و اکثر کاربران از آن استفاده می کنند و با اسکریپت های sh سازگار است ، بنابراین می توانید اسکریپت های sh خود را بدون تغییر آنها اجرا کنید. در این مقاله از این پوسته استفاده خواهیم کرد.

3. پوسته Ksh: پوسته Korn نیز نامیده می شود ، در دهه 80 میلادی توسط دیوید کورن نوشته شد این پوسته با sh و bash سازگار است. Ksh امکانات بهتری از csh , sh ارائه داده است.

4. پوسته Csh و tcsh: لینوکس با استفاده از زبان C ساخته شده است و همین امر توسعه دهندگان را در دانشگاه برکلی بر آن داشت تا پوسته ای به سبک C بسازند که syntax آن مشابه زبان C باشد. به طور معمول از c shell اولیه در لینوکس استفاده نمی‌شود ولی اگر کاربری با Csh آشنا باشد می تواند با tcsh که جایگزین مناسبی برای Csh است، کار کند. Tcsh برخی امکانات جزئی را به csh اضافه کرده است.

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

برای اینکه بدانید لینوکسی که از آن استفاده می کنید از چه نوع shell هایی پشتیبانی می کند کافی است دستور زیر را در ترمینال سیستم خود وارد نمایید:

cat /etc/shells

دستور cat محتوای فایل shells در دایرکتوری etc/ ر ا نشان می دهد.


بش اسکریپتینگ (Bash scripting)

Bash scripting
Bash scripting

اگر تاکنون از یونیکس یا لینوکس استفاده کرده اید ، احتمالاً در زمینه bash تازه کار نیستید. bash در واقع فقط یک زبان برای اجرای دستورات است بنابراین دستوراتی که در تمام مدت تایپ می کردید (به عنوان مثال ، ls ، cd ، grep ، cat) دستورات bash هستند. این فرمان ها، دستورهای خارجی نام دارند و در هر شلی قابل اجرا هستند. چرا که هرکدام از آن ها برنامه کامپایل شده در سیستم هستند و از طریق شل‌های متفاوت می توانند اجرا شود. هر شل دستورات داخلی دیگری نیز دارد که فقط به وسیله خود آن شل قابل شناسایی و اجرا می باشند.

برای اینکه شماره نسخه bash که از آن استفاده می کنید را بفهمید، از دستور زیر در خط فرمان استفاده کنید.

echo $BASH _ VERSION

دستور فوق را می توانید به صورت های زیر نیز استفاده نمایید:

1. echo $BASH _ VERSION$

2.echo "{$BASH_VERSION}"

3.echo "{$BASH_VERSION$}"

( برای اطلاعات بیشتر در مورد bash در خط فرمان تایپ کنید : man bash$ )

شروع کار با bash shell

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

شما می توانید چندین دستور را به وسیله (؛) جدا کنید و یک جا اجرا کنید. به عنوان مثال

ls ؛ pwd

خط قبلی یک اسکریپت bash ساده است. ابتدا دستور ls و به دنبال آن pwd اجرا می شود.

ایجاد اولین فایل bash

برای ایجاد یک فایل متنی می توان از دستورات لینوکس مانند cat استفاده نمود. اما راه ساده تر استفاده از یک ویرایشگر متن مانند vim, gedit, emacs و .... یا یک محیط های توسعه نرم افزار مانند Vscode می باشد.

(همچنین برای شروع می توان از پلتفرم های آنلاین مانند https://www.jdoodle.com/ استفاده نمود.)

اگر شما کاربر ویندوز هستید و نمی خواهید لینوکس را در کنار سیستم عامل و یا در یک نرم افزار مجازی ساز مانند vmWare نصب کنید، نگران نباشید ویندوز 10 در نسخه 2016 به بعد خود امکانی به نام Windows subsystem for Linux را ارائه کرده که با فعال کردن آن از قسمت Programs and features در Control Panel و متعاقب آن نصب نسخه لینوکس مورد نظر خود از Microsoft Store می توانید به راحتی به بک نسخه لینوکس دسترسی داشته باشید.

یک نمونه ساده از bash script

برای شروع بهتر است که با اسکریپت ساده و معروفی که عبارت Hello World را چاپ می کند شروع کنیم. برای این کار باید این برنامه کوچک را در یک ویرایشگر متن مثل emacs بنویسید و با نام Hi و پسوند sh به صورت Hi.sh ذخیره کنید. متن برنامه مورد نظر به شکل زیر می باشد:

#!/bin/bash/

echo " Hello World "

در مرحله بعد باید این فایل را قابل اجرا کنید یعنی Mode آن را تغییر دهید. برای این منظور می توانید از دستور chmod استفاده کنید. در کامند لاین این دستور را تایپ کنید :

$chmod +x hi.sh

توجه داشته باشید که این دستور را در همان محلی که فایل را ذخیره کرده اید اجرا کنید. حال این فایل قابل اجرا شده و برای اجرای این فایل هم کافیست که تایپ کنید :

./hi.sh

اگر درست عمل کرده باشید ، عبارت Hello World نمایش داده خواهد شد. حال کمی به عقب برگردیم و ببینیم که چه کرده ایم.

خط اول که با علامت !# شروع شده مسیر کامل مفسر (Interpreter) که در این‌جا bin/bash/ است را مشخص می‌کند که برای اجرای این فایل قرار است مورد استفاده قرار گیرد. در واقع هیچ اجباری در قرار دادن این خط در ابتدای اسکریپت وجود ندارد . یعنی حتی اگر این خط رو ننویسید و به فایل قابلیت execute بدهید به هیچ عنوان اسکریپت شما به مشکل بر نخواهد خورد مگر اینکه شل مورد استفاده شما bash نباشد .هرچند اگر از پوسته هایی مثل zsh استفاده می کنید باز هم ننوشتن آن خیلی مشکل ساز نخواهد بود . در واقع این فراخونی آدرس ، به کرنل شما اطلاع می دهد که اسکریپت رو با استفاده از شل bash اجرا کند. با قرار دادن این خط در داخل کدها از مشکلات احتمالی در زمان اجرا جلوگیری کنید .

خط دوم. تمامی کاری که انجام داده ایم مربوط به خط دوم است. واضح است که بعد از دستور echo هر عبارتی که بین دو کاراکتر (") بیاید، روی صفحه چاپ می شود. مثلا اگر نام خود را به جای Hello World بنویسید، همان نام چاپ می شود.

یک مثال کامل تر

اسکریپتی که در ادامه ملاحظه میکنید فایل hi.sh را به استفاده از دستور cat تولید کرده و از دستور read برای گرفتن ورودی از کاربر استفاده می نماید. عبارت وردودی در متغیری به نام Name ذخیره شده ، سپس لغت Hello را در کنار ورودی که کاربر وارد کرده چاپ میکند:

در نهایت شما با اجرا کردن یک فایل، می توانید دستورات مورد نظر خود را پشت سر هم اجرا کنید . البته توجه داشته باشید که بش اسکریپت هم مثل زبان ها برنامه نویسی قابیلت استفاده از ساختار های شرطی و تکرار مانند , if while و for را دارد و همچنین استفاده از توابع و کار با انواع فایل ها مانند فایل های json در آن امکان پذیر می باشد که متاسفانه شرح و توضیح کامل نحوه عملکرد و استفاده از آنها در این مقاله کوتاه امکانپذیر نمی باشد.