اسکریپت نویسی شل لینوکس برای وبمسترها – قسمت ۵

اسکریپت نویسی شل لینوکس برای وبمسترها – قسمت۵

در این قسمت با حلقه های تکرار و دستور while آشنا میشویم:

کامپیوتر ها دستگاه های خوبی برای انجام کار های تکراری هستند, در هر ثانیه میلیون ها دستور تکراری در پردازنده شما اجرا میشود تا داده های جدید را پردازش کند, برای استفاده از این مزیت مهم کامپیوتر در شل اسکریپت نویسی لینوکس باید با حلقه های تکرار آشنا شوید, محبوب ترین دستورات حلقه در زبان های برنامه نویسی for و while  هستند

بررسی دستور while

اسکریپت نویسی شل لینوکس برای وبمسترها

While در زبان انگلیسی یعنی تا وقتی که  . . .

این دستور تا وقتی که شرط مشخص شده برای آن صادق باشد, دستورات داخل بلوک خود را اجرا میکند, ساختار کلی دستور while به صورت زیر است:

  1. while []

do

   command1

   command2

   command3

done

در این مثال condition شرطی است که قبل هر بار اجرای دستورات بررسی میشود, و در صورت صحت, دستورات داخل بلوک (هر چیزی که بین کلمات کلیدی do و done  قرار بگیرد) که در این مثال command 1,2,3 هستند اجرا میشوند, حواس تان باشد شرط بررسی شده توسط while باید شرطی باشد که در داخل حلقه یا توسط سرویسی دیگر تغییر میکند, در غیر اینصورت حلقه تا ابد ادامه خواهد یافت.

به مثالی ساده از دستور while توجه کنید

x=1

while [ $x -le 5 ]

do

  x=$(( $x + 1 ))

done

echo “done!”

در این مثال مقدار متغییر x را برابر ۱ قرار میدهیم, سپس حلقه تکراری مینویسیم که مقدار x را با عدد ۵ مقایسه کند, در صورتی که مقدار x کوچکتر یا برابر (le -> Less than or Equal)  عدد پنج باشد, دستور داخل بلوک اجرا میشود, که قرار است مقدار x را با ۱ جمع کند, یعنی یکی به آن اضافه کند, اگر مقدار x را داخل حلقه تغییر نمیدادیم, حلقه تا ابد ادامه داشت, اما با اجرای کد بالا, پس از چهار بار اجرا شدن حلقه, مقدار متغییر برابر ۵ میشود و دیگر شرط [ $x -le 5 ] صحیح نخواهد بود, پس حلقه تمام شده و دستورات بعد حلقه اجرا میشود. که در این مثال متن done! را در خروجی چاپ خواهد کرد.

یک مثال سخت تر و کاربردی تر را با هم ببینیم

counter=$1

factorial=1

while [ $counter -gt 0 ]

do

   factorial=$(( $factorial * $counter ))

   counter=$(( $counter – 1 ))

done

echo $factorial

این کد قرار است فاکتوریل عدد وارد شده را حساب کند.

در قسمت های قبل گفتیم که برای دریافت عدد از کاربر میتوانیم از متغیر های $۱, $۲,$۳, . . . استفاده کنیم

در این کد اولین ورودی وارد شده توسط کاربر را با دستور counter=$1 در متغییر counter قرار میدهیم, متغییر factorial قرار است در نهایت برابر با فاکتوریل عدد وارد شده شود, در حال حاضر آنرا یک در نظر میگیریم.

حلقه while را با شرط بزرگتر بودن counter از عدد صفر (gt -> Greater)  تعریف میکنیم.

در هر بار اجرای حلقه مقدار متغیر factorial در متغیر counter ضرب شده و حاصل آن به عنوان مقدار جدید متغیر factorial ذخیره میشود, در خط بعد از counter یکی کم میکنیم تا دفعه بعد در فاکتوریل ضرب شود.

در نهایت با هر بار کم شدن counte مقدار آن به صفر یک رسیده و شرط $counter -gt 0 دیگر صحیح نخواهد بود, پس حلقه دیگر اجرا نمیشود و برنامه به خط بعد از done خواهد پرید, و دستور echo مقدار متغیر factorial را که برابر فاکتوریل عدد وارد شده است چاپ خواهد کرد.
برای اینکه کد اجرا شود آنرا در فایل script.sh ذخیره کرده و با دستور chmod +x script.sh دسترسی اجرا شدن را به آن میدهیم, حالا با وارد کردن دستور ./script.sh 5 فاکتوریل عدد ۵ چاپ خواهد شد, میتوانید به جای ۵ هر عدد دیگری بزنید, البته برای اعداد بزرگ با خطا و هنگ کردن برنامه مواجه خواهید شد. اگر با دادن عدد ۵, مقدار ۱۲۰ در خروجی چاپ شد, کارتان را درست انجام داده اید.
دستور continue  باعث میشود ادامه دستورات داخل بلوک حلقه خوانده نشده و مستقیم به سطر done پرش کند, مثل مثال زیر:

while [ condition ]

do

  statements1      #Executed as long as condition is true and/or, up to a disaster-condition if any.

  statements2

  if (condition)

  then

        continue   #Go to next iteration of I in the loop and skip statements3

  fi

  statements3

done
در این دستور با صحیح بودن condition در سطر پنجم, دستور continue باعث میشود statement3 اجرا نشود. برای کسب اطلاعات بیشتر از دستور while  دستور help while را در خط فرمان وارد کنید تا راهنمای کامل این دستور را مشاهده کنید.

در قسمت بعد حلقه تکرار for  را معرفی خواهیم کرد.

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

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