مدتها بود تو فکر این بودم که یه راهنمای Shelll Scripting بنویسم که همه بتونند ازش استفاده کنند ( والبته خودم) منتهی به علت قلت اطلاعات نتونستم . برای همین تصمیم گرفتم یه راهنمای خوب پیدا کنم و ترجمش کنم. توی این گشت و گذار یه راهنما توی سایت www.LinuxCommand.org پیدا کردم که خیلی خوب و ابتدایی توضیح داده و بسیار قابل فهم.
<چون مطلب طولانی هستش در جند بخش ترجمه اش می کنم و تیکه تیکه اینجا می گذارم و در آخر هم به صورت یک خود آموز کامل رو سایت می گذارمش.(در ترجمه هم دخل و تصرف های کوچیکی انجام شده) اصل مقاله رو می تونید از اینجا بگیریدش.
کاربردShell Script
شما توسط اسکریپت می توانید مجموعه ای از دستورات رو در یک فابل دخیره و اجرا کنید. با قابلیتهای برنامه نویسی زیادی که shell در اختیار شما قرار می دهد می توانید اسکریپت های فدرتمند تر و کارا تری بنویسید. بسیاری از اعمال سیستم را کنترل کنید , عملیات خود کار سازی کار ها رو انجام دهید و ......
اولین اسکریپت خود را بنویسید
برای نوشتن موفقیت آمیز یک Shell Script باید سه کار را انجام دهید.
-۱ یک اسکریپت بنوسید
-۲ اجازه اجرا شدن را به آن بدهید
-۳ آنرا جایی قرار دهید که shell بتواند آنرا پیدا کند
- نوشتن یک اسکریپت
یک Shell Script یک فایل شامل ASCII Text است . برای ساخت آن شما باید از Text Editor استفاده کنید . Text Editorنرم افزاری است که فایلهای ASCII Text را می خواند و می نویسد.
تعداد زیادی Text Editor در دسترس است که بنا به سلیقتون می توانید یکی از آنها را استفاده کنید. برای ترمینال: vi , vim , emacs , pico , nano
برای محیط گرافیکی : gvim , kedit , gedit , kwrite و .....
اکنون text editor را باز منید و خطوط زیر را در آن وارد کنید:
#!/bin/bash
#My first script
echo “Hello World”
فایل را به یک نام مناسب ذخیره کنید. برای مثال my_script.
خط اول نمایانگر این است که چه برنامه ای برای تفسیر اسکریپت به کار می رود .که در اینجا bin/bash/ می باشد. خط بعد هم تنها یک توضیح است. Bash کلیه خطوطی که با # شروع می شوند را نادیده می گیرد.
- تنظیم مجوز های دسترسی
در مرحله بعد باید اجازه اجرا را به فایل خود بدهید .این کار را توسط دستور chmod می توانید امجام دهید:
chmod 755 my_script
اکنون اسکریپت شما قابل اجرا است. به شکل زیر می توانید آن را اجرا کنید:
./my_script
- اصلاح مسیر دسترسی خودکار به فایل
دلیل اجرای دستور به شکل بالا آن است که فایل در مسیر دسترسی شل قرار ندارد (PATH) شما می توانید یا فایل خود را در یکی از مسیر هایی که در متغیر محیطی PATH تعریف شده قرار دهید یا مسیر فایل خود را با دستور زیر به آن اضافه کنید:
export PATH=$PATH:directory
که این کار به طور موقت مسیر را تغییر می دهد و در صورت راه اندازی مجدد سیستم از بین می رود . برای آنکه در هر بار راه اندازی مجدد سیستم مسیر فایل شما به طور خود کار به PATH اضافه شود می توانید آن را به فایل bash_profile. کنید. در بسیاری از توزیع های جدید کاربران برای برنامه هایی که به طور شخصی استفاده می کنند یک دایرکتوری به نام bin در شاخه خانگی خود می سازند ٬اگر این دارکتوری را ندارید آن را بسازید .
- دستورات
یک سری دستورات هستند که به آنها Shell builtin می گویند و شل آنها را به صورت اتوماتیک می فهمد. می توانید لیست این دستورات را توسط دستور help ببینید.
دسته دیگر دستورات ٬دستورات اجرایی هستند که در مسیر PATH قرار دارند. اکثر دستورات از این دسته هستند.
و دو گروه آخر دستورات که در محیط runtime شما وجود دارند.در طول هر جلسه کاربری سیستم مقادیر زیادی اطلاعات را در حافظه خود نگه می دارد که به آنها متغیر های محیطی می گویند. و اطلاعاتی نظیر مسیر و نام کاربری را در خود نگه می دارند. شما می توانید توسط دستور set یا declare لیست کاملی از آن را ببینید.
این دو نوع دستور موجود در محیط (enviroment)٬ aliasesو توابع شل ( shell function) هستند.
- Aliase
برای اینکه بیشتر گیج نشوید یک Aliase می سازیم. فایل bash_profile. راکه در شاخه خانگی شما قرار دارد باز کنید و آخر آن این خط را اضافه نمایید.
alias l='ls -l'
bash_profile. یک اسکریپت است که هر زمان که به سیسنم login می کنید اجرا می شود .می توانید برای دیدن نتیجه یک بار logout کنید و دوباره login نمایید. مثالی دیگر:
'"alias today='date +"%A, %B %-d, %Y
alias یکی از دستورات builtin است و به طور مستقیم در خط فرمان قابل استفاده است.
- توابع Shell
alias ها برای دستورات ساده مفید هستند٬ اما زمانی که دستورات کمی پیچیده تر شوند٬شما بایذ از توابع شل استفاده کنید. فایل bash_profile. را باز کنید و خطوط زیر را وارد کنید:
function today{
echo “Today's date is:”
date +”%A,%B %-d, %Y”
}
function نیز از دستورات builtin است و می توانید از آن به طور مستقیم در خط فرمان نیز استفاده کنید.
- type
انواع مختلف دستور در اینجا معرفی شد . شاید فراموش کنید که هر دستور از کدام دسته است (builtin , function , alias و دستورات اجرایی ). به کمک دستور می توانید نوع هر دستور را مشخص کنید.
behrad@debian:~$ type <command>
- bashrc.
شما می توانید alias ها و توابع خود را در فایل bash_profile. قرار دهید و استفاده کنید ٬ولی ولی این کار فرم مناسبی برای این کار نیست. فایل جدایی به نام bashrc. وجود دارد که برای چنین منظورهایی قرار گرفته است . شما ممکن است خطوط زیر را در فایل bash_profile. خود دیده باشید:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
این خطوط شاخه خانگی را برای فایل bashrc. جستجو می کند و اگر وجود داشته باشد آنرا اجرا می کند. بهتر است ما نیز کدها ی خود را در bashrc. قرار دهید.
- نوشتن یک اسکریپت کار آمد تر
در ادامه می خواهیم یک اسکریپت کار آمد تر تولید کنیم. این ابزار یک متن html تولید می کند که شامل اطلاعاتی در مورد سیستم شماست.
- نوشتن یک فایل html به وسیله اسکریپت
می دانید که یک فایل html شامل مختویات زیر است :
<HTML>
<HEAD>
<TITLE>
The title of your page
</TITLE>
</HEAD>
<BODY>
Your page content goes here.
</BODY>
</HTML>
اکنون با چیز هایی که می دانیم می تو انیم یک اسکریپت برای تولید محتویات بالا ایجاد کنیم:
#!/bin/bash
# make_page - A script to produce an HTML file
echo "<HTML>"
echo "<HEAD>"
echo " <TITLE>"
echo " The title of your page"
echo " </TITLE>"
echo "</HEAD>"
echo ""
echo "<BODY>"
echo " Your page content goes here."
echo "</BODY>"
echo "</HTML>"
این اسکریپت به صورت زیر قابل استفاده است:
behrad@debian:~$make_page > page.html
اولین بهبودی که در اسکریپت می توان انجام داد جایگزین کردن دستورات echo به شکل زیر است:
#!/bin/bash
# make_page - A script to produce an HTML file
cat << _EOF_
<HTML>
<HEAD>
<TITLE>
The title of your page
</TITLE>
</HEAD>
<BODY>
Your page content goes here.
</BODY>
</HTML>
_EOF_
این اسکریپت فرمی از I/O Redirection است. این روش راهی است تا داده هایی به ورودی استاندارد یک دستور داده شود. در بالا دستور cat یک سری ورودی از اسکریپت ما به ورودی استاندارد خود دریافت می کند.
این اسکریپت ها به صورت زیر تولید می شوند:
command << token
content to be used as command's standard input
token
token می تواند هر رشته ای باشد . در اینجا ما از _EOF_ ( به معنی End of file ) استفاده کردیم. ولی شما می توانید از هر رشته ایی استفاده کنید.گاهی اوقات شما برای خوانایی بیشتر کد آن را به صورت پله ایی می نویسید. برای حذف فواصل سفید می توانید از روش زیر استفاده کنید :
cat <<- _EOF_
استفاده از ->> باعث می شود که bash فواصل اول خط را نادیده بگیرد.
حالا می خواهیم اسکریپت خود را ایجاد کنیم. می توانیم به جای آنکه یک نوشته را چند بار بنویسیم آن را به صورت زیر اصلاح کنیم:
#!/bin/bash
# make_page - A script to produce an HTML file
cat <<- _EOF_
<HTML>
<HEAD>
<TITLE>
My System Information
</TITLE>
</HEAD>
<BODY>
<H1>My System Information</H1>
</BODY>
</HTML>
_EOF_
اسکریپت اصلاح شده:
#!/bin/bash
# make_page - A script to produce an HTML file
title="My System Information"
cat <<- _EOF_
<HTML>
<HEAD>
<TITLE>
$title
</TITLE>
</HEAD>
<BODY>
<H1>$title</H1>
</BODY>
</HTML>
_EOF_
-متغیر ها
متغیر ها مکانهایی از حافظه هستند که می توانیم برای نگهداری اطلاعات از آنها استفاده کنیم و به وسیله یک نام به آن اطلاعات دسترسی داشته باشیم. در مثال قبلی ما متغیر title را داشتیم که مقدار " My System Information “ را در حافظه قرار می دهد. در اسکریپت ما از title$ استفاده کردیم تا به shell بگوییم تا مقدار متغیر را جایگزین آن کند.
- ساخت متغیر ها
برای تعریف متغیر مقدار آن٬ از اسمش٬ با یک مساوی جدا می شوند. در دو طرف مساوی نباید هیچ فاصله ای باشد.
- تعیین نام متغیر
برای انتخاب نام متغیر شما باید قوانین زیر را رعایت کنید:
- نام متغیر باید یا حرف شروع شود
- نباید دارای فاصله خالی باشد. می تونید از underscor استفاده کنید
- از نقطه گداری استفاده نکنید.
- از کلمات رزرو شده bash نباید استفاده کنید. لیست آن را به وسیله دستور help می توانید مشاهده کنید.
زمانی که شما یک جلسه shell را آغاز می کنید یک سری اطلاعات محلی در یک سری متغیر ذخیره می شود که از آنها نیز می توانید در اسکریپت های خود استفاده کنید. برای دیدن لیستی از آن می توانید از دستور set استفاده کنید. یک متغر محیطی وجود دارد که Hostname شما را نگهداری می کند٬ ما می خواهیم از آن در اسکریپت خود استفاده کنیم:
#!/bin/bash
# make_page - A script to produce an HTML file
title="System Information for"
cat <<- _EOF_
<HTML>
<HEAD>
<TITLE>
$title $HOSTNAME
</TITLE>
</HEAD>
<BODY>
<H1>$title $HOSTNAME</H1>
</BODY>
</HTML>
_EOF_
اکنون اسکریپت ما شامل hostname سیستمی است که در آن اجرا می شود. همیشه به این نکته توجه داشته باشید که متغیرهای محیطی همگی با حروف بزرگ هستند.
در مثالهای قبلی ما روش ساخت متغیرها و استفاده از آن را توضیح دادیم در زیر می خواهیم همان مثال را توسعه دهیم. در اسکریپت زیر می خواهیم علاوه بر قرار دادن نام hostname در فایل html تولید شده ٬به آن برچسب زمانی و کاربری که آن را تولید کرده را هم اضافه کنیم:
#!/bin/bash
# make_page - A script to produce an HTML file
title="System Information for"
cat <<- _EOF_
<HTML>
<HEAD>
<TITLE>
$title $HOSTNAME
</TITLE>
</HEAD>
<BODY>
<H1>$title $HOSTNAME</H1>
<P>Updated on $(date +"%x %r %Z") by $USER
</BODY>
</HTML>
_EOF_
در این اسکریپت ما از یک متغیر محیطی جدید به نام USER و یک شکل جدید دستور (date +"%x %r %Z")$ استفاده کردیم.
کاراکتر های ()$ به شل می گویند که نتیجه دستور ارایه شده را جایگزین کن. در مورد دستور date و نحوه عملکرد آن هم می توانید از دستور زیر استفاده کنید:
behrad@debian:~$ date --help | less
این کار رو می توان به دو روش انجام که روش دوم مربوط از است به شل نسخه قدیمی (sh) که البته در bash نیز پشتیبانی می شود:
$(command)
'command'
- help-- و دیگر ترفند ها
برای آنکه نحوه استفاده از دستورات را بفهمید می توانید از manpage آن دستور یا راهنما های موجود در سایت www.linuxcommand.org استفاده کنید. در صورتی که راهنما موجود نبد می توانید گزینهhelp-- را به همراه دستور به کار ببرید. تمام ابزار هایی که توسط پروژه گنو و بنیاد نرم افزار آزاد نوشته شده اند این گزینه را پشتیبانی می کنند.
حالا اگر هیچ یک از راه های بالا برای یک دستور در دسترس نبود چه می توان کرد؟
من از این ترفند استفاده می کنم:
ابتدا مکان فایل اجرایی را پیدا کنید.( ای روش برای برنامه هاست ٬نه برای دستورات builtin شل).
behrad@debian:~$ which command
این دستور مسیر و فایل اجرایی برنامه را به شما می دهد. سپس توسط دستور strings متون قابل خواندن در برنامه را استخراج می کنیم. متون قابل خواندن درون برنامه ممکن است شامل پیغامهای خطا ٬توضیحات برنامه نویس و متون help باشد که می توان از آنه استفاده کرد . در زیر برای مثال بنامه bash را بررسی می کنیم:
behrad@debian:~$ which bash
/bin/bash
behrad@debian:~$ strings /bin/bash
در نهایت اگر شما بسیار کنجکاو باشید می توانید کد منبع برنامه را بررسی کنید .حتی اگر کدهای برنامه را متوجه نمی شوید می توانید از توضیخت برنامه نویس ( comment) در متن استفاده کنید.
- نسبت دادن نتیجه دستورات به متغیر
شما می توانید نتیجه یک دستور را در یک متغیر قرار دهید:
right_now=$(date +"%x %r %Z")
شما همچنین می توانید مانند زیر یک متغیر درون دیگری قرار دهید:
right_now=$(date +"%x %r %Z")
time_stamp="Updated on $right_now by $USER"
- ثابت ها (Constants)
چون در پیاده سازی تفوتی با متغیر ها ندارد توضیح داده نمی شود.
- نقل قول (Quoting)
در اینجا چیزی را می خواهیم توضیح دهیم که تا حالا استفاده می کردیم ولی در مورد آن توضیحی داده نشده بود. در اینجا ما در مورد علامت نقل قول یا quoting توضیح خواهیم داد. Quoating به دو منظور استفاده می شود :
-۱ برای کنترل و محدود کردن جایگزین ها
-۲ برای نشان دادن مجموعه ای از کلمات
ما از کوتیشن برای نسبت دادن جملات به ثابت ها استفاده می کنیم:
TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"
در این مثال متن به وسیله یک جفت دابل کوتیشن احاطه شده است. در اینجا قصد ما ایجاد گروهی از کلمات بوده است. در صورتی که از آنها استفاده نکنیم shell هر یک از کلمات را به عنوان یک دستور در نظر می گیرد. دستور زیر را امتحان کنید:
behrad@debian:~$ TITLE=System Information for $HOSTNAME
-کوتیشن و دابل کوتیشن
shell هم کوتیشن و هم دابل کوتیشن را می شناسد. دو مقدار زیر با هم برابرند:
var="this is some text"
var='this is some text'
با وجود این یک تفاوت مهم بین این دو وجود داره. همونطور که در مثالهای قبلی دیدید بین دابل کوتیشن می توانید از متغیر ها استفاده کنید و شل نیز آنها را با مقدارشان جایگزین می کند. اما کونیشن همه را به عنوان یک جمله در نظر می گیرد. به مثالهی زیر توجه کنید:
behrad@debian:~$ echo "My host name is $HOSTNAME."
My host name is debian.
اگر دابل کوتیشن را به کوتیشن تبدیل کنیم:
behrad@debian:~$ echo 'My host name is $HOSTNAME.'
My host name is $HOSTNAME.
نویسنده : بهراد اسلامی فر
behrad At Giveme5 Dot ir
www.giveme5.ir
