
سیستم عامل لینوکس، از هزاران دستور تشکیل شده است. در بسیاری از مواقع، نیاز داریم، ترکیبی از دستورات، با ترتیب مورد نظر را، اجرا نماییم. اسکریپت نویسی شل، به منظور انجام دستهای از دستورها، با ترتیب و شرایط خاص در لینوکس میباشد. اسکریپت شل یک فایل متنی اجرایی شامل دستورات، پارامترها و کامنتها میباشد. دستورات در اسکریپتها،خط به خط توسط مفسر شل، اجرا میگردد. در سیستم عامل DOS به این فایلها Batch file یا فایلهای دستهای گفته میشد. در کامپیوترهای مینفریم IBM با سیستم عامل VM به این نوع فایلها EXEC میگفتند. برای توضیح بیشتر در باره اسکریپت نویسی شل در لینوکس با ما همراه باشید.
شل یا پوسته
شل یا پوسته، برنامهای است که دستوراتی که از طریق کیبرد، توسط کاربر وارد میشود را به سیستم عامل انتقال میدهد. با برنامهی شل، ما میتوانیم دستورات و برنامهها را اجرا نموده و یا برای نحوهی اجرای آنها اسکریپت نویسی نماییم.
انواع شل
برای انواع شل در لینوکس، آنها را میتوان به دو دسته تقسیم نمود: اول گروه Bourne Shell با نشانهی دستور $ و دوم C shell با نشانهی دستور %.
گروه Bourne shell
- Bourne Shel
- Bourne Again Shell
- Korn Shell
- Posix Shell
گروه C Shell
- C shell
- TENEX/TOPS C Shell
چگونه یک اسکریپت شل را بنویسیم
اسکریپتنویسی در شل، یک زبان برنامهنویسی با نگارش مخصوص به خود میباشد. در ادامهی مطلب مثالها بر روی شل bash اجرا خواهد شد. اسکریپتی که با هر یکی از انواع شل نوشته میشود لزوما با نگارشهای دیگر شل اجرا نخواهد شد. برای ایجاد یک اسکریپت شل مراحل زیر را انجام میدهیم:
در ابتدا توسط یک ویرایشگر مثل ویرایشگر vi ، یک فایل متنی را ایجاد کرده و کدنویسی مورد نظر را انجام می دهیم. در اول هر فایل اسکریپت باید خط bin/bash/!# را اضافه نماییم. در صورتی که از شلهای غیر از bash استفاده کنیم، نام آن شل را بجای bash، استفاده میکنیم. برای اجرای اسکریپتهای شل، به دو صورت میتوان عمل نمود.
روش اول اجرای فایل توسط دستور bash میباشد.
1 2 3 |
kazemian@upgradeit:~$ bash my-script.sh |
در روش دوم مد یا حالت فایل را به فایل اجرایی تغییر میدهیم و مستقیما فایل را اجرا می کنیم.
1 2 3 4 |
kazemian@upgradeit:~$ chmod a+rx my-script.sh kazemian@upgradeit:~$ ./my-script.sh |
برای کامنت گذاری در اسکریپتهای شل از # استفاده مینماییم. هر خطی که با کاراکتر # شروع شود اجرا نخواهد شد و نادیده گرفته میشود. از هر قسمتی از خط نیز که از کاراکتر # استفاده نماییم، از آن قسمت به بعد برای مفسر اسکریپت، به عنوان کامنت فرض شده و اجرا نخواهد گردید.
1 2 |
# This line is shell script comment cp filename1 filename2 #This line copy filename1 to filename2 |
برای شروع یک اسکریپت ساده را مینویسیم:
1 2 3 |
#!/bin/bash #This line is a Comment echo hello word! #This part is a comment |
بعد از ذخیره کردن فایل اسکریپت و اجرا نمودن آن خروجی زیر مشاهده میگردد:
1 2 3 4 5 |
kazemian@upgradeit:~$ ./my-script.sh hello word! kazemian@upgradeit:~$ |
برای اجرای بیش از یک دستور در هر خط از سمیکالن استفاده میگردد.
1 |
echo hello word! ; echo hello again |
متغیرها
متغیرها در شل یا متغیرهای محیطی هستند که به طور پیشفرض توسط شل مقدارگذاری شدهاند و یا به توسط کاربر تعریف میشوند.
متغیرهای محیطی یا Environment Variables
متغیرهای محیطی، متغیرهایی هستند که حاوی اطلاعات مربوط به نشست حاضر کاربر و اطلاعات اختصاصی مربوط به شل میباشند. مثلا متغیر HOME مسیر پیشفرض دایرکتوری home کاربر جاری را نشان میدهد:
1 2 3 4 5 |
kazemian@upgradeit:~$ echo $HOME /home/kazemian kazemian@upgradeit:~$ |
شل لینوکس دارای متغیرهای محیطی میباشد که مقادیر مربوط به تنظیمات و مشخصات سیستم عامل را در آن ذخیره شده است.
متغیرهای محلی
برای تعریف یک متغیر و اختصاص مقدار بهآن، به صورت زیر عمل میکنیم.
1 2 3 4 5 6 |
#!/bin/bash greeting="Welcome" user=$(whoami) date=$(date) echo "$greeting back! $user. The current date is : $date" echo "Your Bash Shell version is : $BASH_VERSION" |
این اسکریپت را در فایل my-script.sh ذخیره میکنیم. با اجرای my-script.sh نتیجهی اجرا، به صورت زیر میباشد.
1 2 3 4 5 |
kazemian@upgradeit:~$ ./my-script.sh Welcome back! Kazemian. The current date is : Wed 28 Oct 2020 04:51:38 PM +0330 kazemian@upgradeit:~$ Your Bash Shell version is : 5.0.17(1)-release |
توجه داشته باشید که، برای نامگذاری متغیرها در شل، حروف بزرگ و کوچک با هم فرق دارند و اصطلاحا، case sensitive میباشد.
مقاسیه در متن و اعداد
جدول زیر علامتهای مربوط به مقایسه بین حروف و اعداد نمایش داده شده است که از آن میتوان در دستورات شرطی استفاده نمود:
شرح | مقایسهی متن | مقایسهی عدد |
---|---|---|
کمتر از | < | lt |
بیشتر از | > | gt |
مساوی | = | eq |
نامساوی | =! | ne |
کوچکتر مساوی | – | le |
بزرگتر مساوی | – | ge |
دستورات شرطی
نحوهی نگارش دستورات حاوی شرط به ضورت زیر میباشد:
1 2 3 4 5 6 7 8 |
#!/bin/bash directory="/home/kazemian/test" #Condition check for directory exist if [ -d $directory ]; then echo "Directory exists" else echo "Directory does not exist" fi |
در اسکریپت فوق، در مسیر ذکر شده، در صورتیکه دایرکتوری test وجود داشته باشد یا نداشته باشد آن را، اعلام میکند .
حلقهی for
وقتی بخواهیم مجموعهای از دستورات، با تعداد مشخصی، تکرار شوند از حلقهی for ، استفاده مینماییم.
1 2 3 4 5 |
#!/bin/bash #For loop example for f in $( ls /etc ); do echo $f done |
در مثال بالا، تمام فایلها و دایرکتوریهای مسیر ذکر شده نمایش داده میشود.