در این آموزش میخوام درمورد شلاسکریپتینگ حرف بزنم. به نقل از ویکیپدیا:
شل یک نرم افزار است که یک رابط کاربری برای استفاده از هسته سیستمهای عامل ایجاد میکند. شلها معمولا به دو بخش تقسیم میشوند: ۱- دستور و فرمان مانند: کامند لاین در سیسنم عامل ها ۲- گرافیکی
در سیستم های پیشرفته شل قسمتی از نرم افزار است که در سیستم عامل های پیشرفته بدون هیچ دانشی پایه ای برای کاربردهای خاص ایجاد شده است
پس شلاسکریپتینگ، به این معنا هست که کدهایی بنویسیم و به شل بدیم که برای ما کارهای کوچک انجام بده. به عنوان مثل، اگه ما میخوایم تمام فایلهای zip یک فولدر رو پاک بکنیم، به سادگی میتونیم از این اسکریپت یک خطی استفاده بکنیم:
find -name ‘*.zip’ -exec rm ‘{}’
ولی مطمئنا برای یه اسکریپت ده سطری بهتره از یک فایل استفاده کنیم. ما میتونیم همین کد رو توی یک فایل به این شکل هم بذاریم:
#! /bin/bash
find -name ‘*.zip’ -exec rm ‘{}’
سطر اول، یعنی این اسکریپت رو با bash اجرا بکنه. سطر دوم هم که دستور find رو با آرگومنتهاش اجرا میکنه.
برای اجرای این اسکریپت، از دو روش میتونید استفاده بکنین:
bash scriptname
و یا:
./scriptname
برای روش دوم، اسکریپت باید مجوز اجرایی داشته باشه. برای دادن این مجوز، میتونین از دستور chmod استفاده بکنین:
chmod +x scriptname
ورودیها و خروجیها
در شل سه خروجی و ورودی stdin، stdout و stderr وجود دارن. stdin، ورودی رو از کاربر میگیره. stdout روی صفحه نمایشگر چیزی رو مینویسه (مگر اینکه به برنامه یا فایل دیگهای داده بشه) و stderr ارورها رو چاپ میکنه.
مدیریت ورودیها و خروحیها
ما میتونیم نتیجه stdout و stderr رو به این وسیله توی یه فایل ذخیره بکنیم:
stdout:
command > filename
stderr:
command 2> filename
یا میتونیم stdin رو از یک فایل بگیریم:
command < filename
همینطور، ما میتونیم stdout یک دستور رو به وسیله pipe (|) به یه دستور دیگه بدیم:
command1 | command2
متغیرها
برای تعریف یک متغیر، میتونیم از این روش استفاده بکنیم:
VAR=value
و برای این که یک متغیر رو از بین ببریم، میتونیم از دستور unset استفاده بکنیم:
unset VAR
برای استفاده از متغیرها، باید قبل از اونها از علامت $ استفاده بکنیم:
echo $VAR
توجه کنین لازم نیست حتما از حروف بزرگ استفاده بکنین.
برای گرفتن ورودی از کاربر و دادن اون به یه متغیر هم میتونین از کامند read استفاده بکنین:
read VAR
شرطها و حلقهها
مثل بیشتر زبانهای برنامهنویسی، این زبان هم دستوراتی برای نوشتن شرط و حلقه داره.
if
دستور if، چک میکنه که دستوری که بهش دادیم درست اجرا شده یا نه. اگه بخوایم از این استفاده کنیم برای مقایسه متن و اعداد، باید از دستور “test” یا همون “[\” استفاده بکنیم. بعد از دستور if، باید از دستور then استفاده بکنیم و در آخر از fi برای تموم کردن. بین then و fi دستورهایی رو که لازم دارین درصورت برقراری شرط اجرا شن بنویسین. اگه بخواین طوری بکنین که درصورت اشتباه بودن اون شرط، یه شرط دیگه رو امتحان کنه، باید از elif به همون روش if استفاده بکنین. درصورتی هم که بخواین وقتی همه شرطها اشتباه شد، یه کار دیگه بکنه، میتونین از else استفاده بکنین:
read VAR
if [ $VAR -gt 50 ]; then
echo “$VAR is greater than 50!”
elif [ $VAR -lt 50 ]; then
echo “$VAR is less than 50!”
else
echo “$VAR equals 50!”
fi
در اسکریپت بالا، اول یک متغیر به اسم VAR از کاربر گرفته میشه. بعد if چک میکنه که این متغیر از ۵۰ بزرگتر هست یا نه. اگه باشه، مینویسه بزرگتره. ولی اگه نباشه، elif رو اجرا میکنه. اگه این شرط درست باشه، مینویسه کوچیکتره. ولی اگه اینم نشه، پس حتما مساوی هستن و از طریق else، نوشته میشه که مساوی هستن.
نکته: برای اطلاعات بیشتر درمورد دستور test (یا همون [) از manual اون کمک بگیرین:
man test
for
برای استفاده از حلقه for، میتونین از دو روش استفاده بکنین. اول این که یک سری آرگومنت بهش بدین و اونها رو یکی یکی به یک متغیر بده. به این شکل:
for i in 1 2 3 4 5 6 7 8 9 10; do
echo “$i”
done
توجه بکنین که for با do شروع و با done تموم میشه.
این for به سادگی میاد آرگومنتهای داده شده رو یکی یکی چاپ میکنه. این روش ممکنه برای نوشتهها خوب باشه، ولی اگه بخوایم از یک تا صد با for چاپ بکنیم، این روش مفید نیست. بهتره از این روش که برای برنامهنویسهای C و جاوا آشناست، استفاده بکنیم:
for ((i=0; i<10; i++)); do
echo $i
done
این for به این صورت کار میکنه که اول مقدار متغیر i رو ۰ میکنه. بعد، تا وقتی که کمتر از ۱۰ هست، یکی یکی اضافه میکنه. هر دفعه هم چاپش میکنه.
while
دستور while رو میتونیم ترکیب for و if بدونیم. این دستور تا وقتی که شرطی برقرار باشه، دستوراتی رو که بهش دادیم اجرا تکرار میکنیم. برای مثال، اگه بخوایم اسکریپتی بنویسیم که هر ۱۰ دقیقه و تا وقتی که یک فایل وجود داشته باشه اون رو کپی بکنه به پوشه ~/backups، میتونیم به این صورت از while استفاده بکنیم:
while ls filename; do
cp filename ~/backups
sleep 10m
done
این دستور میاد تا وقتی که دستور ls ارور نداده، فایل رو کپی میکنه به ~/backups. بعد با دستور sleep، ده دقیقه منتظر میمونه و دوباره شرط رو چک میکنه و اجرا میکنه کامندها رو.
نکته: برای بیرون اومدن از حلقهها، میتونین از دستور break استفاده بکنین.
این یک آموزش کامل از شلاسکریپتینگ نیست و فقط برای شروع کافیه. برای ادامه، میتونین از این این منبع فارسی یا این منبع انگلیسی استفاده بکنین.