شل اسکریپت (Shell Script) روی VPS (بخش سوم) — از صفر تا صد

آخرین به‌روزرسانی: ۱۴ آبان ۱۳۹۷
زمان مطالعه: ۳ دقیقه

عبارت‌های شرطی برای هر زبان برنامه‌نویسی اسکریپت نویسی و با امکانات کامل، گزینه‌ای ضروری محسوب می‌شوند. در بخش سوم و پایانی این سلسله آموزش‌های شل اسکریپت با دستورهای if و else در bash آشنا می‌شوید و شیوه استفاده از آن‌ها را می‌آموزید. در این مقاله فرض ما بر این است که قبلاً پوشه شل اسکریپت خود را بر مبنای آن جه در بخش اول این راهنما آموختیم پیکربندی کرده‌اید.

دستور if

یک عبارت شرطی برای اجرای اقدامات خاصی در صورت درست بودن یا نادرست بودن یک شرط استفاده می‌شود. در شل اسکریپت‌ها این وضعیت از طریق دستور if تعریف می‌شود. در ادامه‌ی دستورِ if عبارتی که قرار است بررسی شود می‌آید. این عبارت می‌تواند کد خروج (exit) اجرای یک دستور، یک عبارت ریاضیاتی، و یا هر چیز دیگری باشد. زمانی که با کدهای exit کار می‌کنیم، این دستور کاملاً سرراست است:

if ls folder
then
echo "Folder exists"
fi

اگر پوشه وجود داشته باشد دستور echo اجرا می‌شود، چون کد خروج 0 به عنوان موفقیت‌آمیز بازگشت یافته است. در غیر این صورت اگر پوشه وجود نداشته باشد، متنی نمایش نخواهد یافت. همه عبارت‌های if باید دارای دستور then باشند و با یک fi خاتمه یابند. اگر با کدهای exit کار نمی‌کنید و برای مثال می‌خواهید یک عبارت ریاضیاتی را بررسی کنید، باید از دستور test استفاده کنید. عملگرهای زیر در شل اسکریپت برای مقایسه اعداد استفاده می‌شوند:

-eq برابر است یا
-ne برابر نیست با
-lt کمتر از
-le کمتر مساوی با
-gt بزرگ‌تر از
-ge بزرگ‌تر یا مساوی

دستورهای test را می‌توان به دو روش نوشت:

if test 4 -gt 3
یا
if [4 -gt 3]

هر دو دستور فوق نتیجه یکسانی دارند و نیازمند then و if نیز هستند. مثال:

if [20 -lt 10]
then
echo "What?"
fi

در کد فوق عبارت ?What هرگز برای کاربر نمایش نمی‌یابد، زیرا 20 بزرگ‌تر از 10 است. اکنون اگر بخواهیم در صورت نادرست بودن عبارت شرطی یک پیام به کاربر نمایش دهیم چه باید بکنیم؟

دستور else

دستور else چنان که از نامش مشخص است، یک مسیر جایگزین برای دستور if اضافه می‌کند. اساس کار آن به صورت زیر است:

if [20 -lt 10]
then
   echo "What?"
else
   echo "No, 20 is greater than 10."
Fi

علاوه بر عبارت‌های ریاضیاتی می‌توان به مقایسه رشته‌ها با if/else نیز پرداخت. این کار نیازمند دستور زبانی است که تا حدودی متفاوت است؛ اما همچنان از دستورهای تست یا [] استفاده می‌کند. ساختار آن چنین است:

string = string      or string equals string
string!= string      or string does not equal string
string               or string is not null or not defined
-n string            or string is not null and exists
-z string            or string is null and exists

همچنین روشی برای دانستن مشخصات فایل‌ها وجود دارد:

-s file    خالی نبودن فایل را بررسی می‌کند
-f file    فایل بودن و عدم پوشه بودن را بررسی می‌کند
-d folder  پو. شه بودن و عدم فایل بودن را بررسی می‌کند
-w file    نوشتنی بودن فایل را بررسی می‌کند
-r file    فقط-خواندی بودن فایل را بررسی می‌کند
-x file    اجرایی بودن فایل را بررسی می‌کند

If های تو در تو

از عبارت‌های if می‌توان درون عبارت‌های if دیگر نیز استفاده کرد و بدین ترتیبت if تو در تو ایجاد می‌شود. در مثال زیر این وضعیت به کمک ورودی ارائه شده از سوی کاربر با استفاده از دستور read بررسی می‌شود:

#!/bin/bash
echo "Input which file you want created"
read file
if [-f $file]
then
echo "The file already exists"
else
   touch $file
   if [-w $file]
   then
      echo "The file was created and is writable"
   else
      cho "The file was created but isn't writable"
   fi
fi

اسکریپت نمونه

در مثال زیر تلاش می‌کنیم اسکریپت پشتیبان‌گیری فایل‌های خود را که در بخش‌های قبلی این راهنما معرفی کردیم بهبود ببخشیم. این نسخه از اسکریپت اقدام به تست کردن پوشه پشتیبانی می‌کند تا ببیند آیا پوشه وجود دارد یا نه و اگر وجود نداشت امکان ایجاد آن را دارد. در ابتدا اسکریپت را ایجاد می‌کنیم:

touch ~/bin/filebackup3
chmod +x ~/bin/filebackup3
nano ~/bin/filebackup3

و سپس آن را ویرایش می‌کنیم:

#!/bin/bash
#Backup script 3.0
#Description: makes a copy of any given file at the backup folder
#Author: Your Name
#Date: 9/29/2013
#Request the backup folder from the user:
echo -e "\e[47m\e[1m\e[32mFile Backup Utility\n\e[39m\e[0m\e[47mPlease input your backup folder:"
read BACKUPFOLDER
#The script will make sure the folder exists
if [-d $BACKUPFOLDER]
then
   echo "You backup folder exists and will be used."
else
   mkdir $BACKUPFOLDER
   if [-d $BACKUPFOLDER]
   then
      echo "Backup folder created successfully."
   else
      echo -e "I do not have the rights to create your backup folder.\nThis script will now exit."
      exit 1
#exit 1 is a command that exits the script with an error code
   fi
fi
#Request files to be backed up:
echo -e "\e[30mWhich files do you want backed up?\e[39m\e[49m"
read FILES
if [-n $FILES]
then
   cp -a $FILES $BACKUPFOLDER
else
   echo "File does not exist."
fi

این اسکریپت می‌گوید که پوشه پشتیبانی که وارد کرده‌اید، وجود ندارد، می‌تواند آن را ایجاد کند یا نمی‌تواند آن را ایجاد کند و این که شما هنگام وارد کردن نام فایل‌ها رشته‌ای خالی وارد کرده‌اید یا نه.

سخن پایانی

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

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
digitalocean

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *