(Shell Scripting – بخش سوم)

از درد سر دوری کنید

اکنون که اسکریپت ما کمی پیچیده شده است٬ من می خواهم به تعدادی از اشتباهاتی که ممکن است در آن مرتکب بشوید اشاره کنم. برای این منظور اسکریپتی که در ادامه آمده است را با نام trouble.bash ایجاد می کنیم. مطمئن شوید مانند آنچه در ادامه آمده است را ایجاد کنید:

#!/bin/bash

number=1

if [ $number = "1" ]; then
    echo "Number equals 1"
else
    echo "Number does not equal 1"
fi



زمانی که شما این اسکریپت را اجرا می کنید٬ خروجی آن "Number equal 1 ” خواهد بود ٬زیرا که متغیر number برابر ۱ است. در صورتی که خروجی مورد نظر را دریافت نکردید ٬متن تایپ شده را را چک کنید ٬مطمينا دچار اشتباه شده اید.



متغیر خالی

اسکریپت را ویرایش کنید و خط ۳ را به شکل زیر تفییر دهید:

number=1

به

number=

سپس اسکریپت را مجددا اجرا کنید. اکنون شما باید مانند زیر جواب بگیرید:

behrad@debian:~$./trouble.bash
/trouble.bash: [: =: unary operator expected.
Number does not equal 1

همانطور که ملاحظه می کنید bash زمانی که اسکریپت را اجرا می کند یک پیغام خطا صادر می شود. شاید شما فکر کنید که بر داشتن ۱ در خط سوم یک مشکل نگارشی(syntax) به وجود آورده ٬ولی اینطور نیست. بگذارید یک بار دیگر به این پیغام خطا نگاه کنیم:

./trouble.bash: [: =: unary operator expected

مشاهده می کنید که ./trouble.bash یک پیغام خطا صادر کرده است که مورد خطا "[“ نوشته شده است. اگر به خاط داشته باشید "[“ مربوط به دستور test است . از اینجا متوجه می شویم که هطا در خط ۵ اتفاق افتاده است نه در خط ۳ .

اجازه دهید ایتدا توضیح دهم که چرا در خط ۳ مشکلی وجود ندارد. Number= از لحاظ نگارشی صحیح است و هیچ مشکلی ندارد. بعضی مواقع شما می خواهید متغیر هایی تعریف کنید که دارای هیچ مقداری نباشند. شما می توانید صحت این دستور را از طریق خط فرمان آزمایش کنید:

behrad@debian:~$ number=

behrad@debian:~$

می بینید که خطایی اتفاق نمی افتد. پس در خط ۵ چه مشکلی به وجود آمده است؟ این دستور که قبلا بدون مشکل اجرا می شد!

برای فهم این خطا اجازه دهید آن را از دید خود شل نگاه کنیم. به یاد دارید کخ شل بیشتر وقت خود را صرف جایگزینی جمله ها می کند. در اولین اسکریپت (زمانی که number=1 بود) شل مقدار1 را به جای $number قرار می دهد:

if [ 1 = "1" ]; then

بنابراین٬ زمانی که ما number را یک متغیر خالی فرض کنیم ٬شل آن را مانند زیر مشاهده می کند:

if [ = "1" ]; then

که این یک خطاست .این موضوع ادامه پیغام خطایی که دریافت کردیم را نیز تفسیر می کند. “=” یک عملگر دو تایی است٬ که انتظار دارد دو عملوند در دو طرف آن قرار داشته باشد. در اینجا شل می خواهد به ما بگوید که تنها یک عملوند وجود دارد و یا اینکه عملگر باید یک عملگر تک عملوندی (مانند !) باشد تا بر روی یک عملوند اعمال شود. برای اصلاح این مشکل خط ۵ را به صورت زیر اصلاح کنید:

if [ "$number" = "1" ]; then

اکنون زمانی که شل جایگزینی را انجام می دهد آن را به صورت زیر می بیند:

if [ "" = "1" ]; then

که کاملا نظر ما را بر آورده می کند.

این مثال یک امر مهم را به ما گوشزد می کند و آن ایمکه در هنگام نوشتن اسکریپت٬ در نظ بگیرید که اگر متغیر برابر چیزی قرار نگرفت(هیچی (-; ) چه اتفاق می افتد.



از قلم انداختن کوتیشن

خط شماره ۶ را ویرایش کرده و کوتیشن را از آخر آن بردارید:

echo "Number equals 1

سپس اسکریپت را مجددا اجرا کنید. شما باید پیغام زیر را دریافت کنید:

behrad@debian:~$ ./trouble.bash
./trouble.bash: line 8: unexpected EOF while looking for matching "
./trouble.bash: line 10 systax error: unexpected end of file

در اینجا نیز خطا در یک خط اسکریپت باعث ایجاد مشکل در ادامه آن شده است. چه اتفاقی رخ می دهد؟

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



قرنطینه کردن مشکلات

پیدا کردن مشکلات در برنامه گاهی می تواند بسار سخت و نا امید کننده باشد. در اینجا دو تکنیک٬ که می تواند برای شما مفید باشد را توضیح خواهیم داد:

قرنطینه کردن قسمتی از کد یا توضیحی کردن آن . در این ترفند شما باید کاراکتر توضیح (مانند #) را در اول خطوط قرار دهید تا شل آنها را نخواند. متناوبا این کار را برای بلاک های خاص از کد انجام می دهید و بررسی می کنید که آیا مشکل حل شده است یا نه. با انجام این کار متوجه می شوید که کدام قسمت از برنامه باعث بروز خطا شده است.

برای مثال ٬زمانی که ما به دنبال کوتیشن های از قلم افتاده هستیم می توانید این کار را انجام دهید:

#!/bin/bash

number=1

if [ $number = "1" ]; then
    echo "Number equals 1
#else
#   echo "Number does not equal 1"
fi

با توضیحی کردن قسمت else و سپس اجرای اسکریپت٬ می توانیم نشان دهیم که مشکل از بخش else نیست.



استفاده از دستور echo برای بررسی مفروضات٬ اکنون که در دنبال کردن خطاها(bug tracking)تجربه پیدا کرده اید٬ متوجه می شوید که خطا ها اغلب آنجایی که انتظار دارید نیستند. معمولا مشکل آن است که در مورد کارایی برنامه خود یک فرض اشتباه در نظر گرفته اید. شما یک خطا در جایی از برنامه می بینید و فکر می کنید مشکل اصلی برنامه از آنجاست٬ که اغلب اشتباه است. برای مقابله با این مشکل شما باید از دستور echo برای پیدا کردن خطا ٬ آزمایش برنامه و ایجاد پیغام ها ٬ برای بررسی آنکه آیا برنامه آن چیزی که شما انتظار دارید را انجام می دهد ٬ استفاده کنید. دو نوع پیغام وجود دارد که شما باید در برنامه استفاده کنید:

اولین نوع تنها اعلام می کند که شما به نقطه مشخصی از برنامه رسیده اید. این نوع را در قسمت stubbing مشاهده کردید. این نوع برای بررسی آنکه روند برنامه آنطور که ما انتظار داریم هست یا نه٬ مناسب است.

نوع دوم٬ نمایش مقدار متغیر هایی که در محاسبات و شروط استفاده شده اند. شما اغلب متوجه می شوید که قسمتی از برنامه شما اجرا نمی شود و علت آن این است که بعضی از متغیر ها و مقادیر که شما آنها درست فرض کرده اید به غلط مقدار دهی می شوند و ایجاد مشکل می کنند.



نمایش آنچه اسکریپت شما انجام می دهد

bash این امکان را به شما می دهد تا آنچه را که در هنگام اجرای اسکریپت انجام میدهد ٬مشاهده کنید.برای این کار گزینه "x-” را به خط اول اسکریپت خود اضافه کنید:

#!/bin/bash -x

اکنون زمانی که شما اسکریپت خود را اجرا می کنید٬ bash هر خط را که اجرا می کند (به همرا جایگزینی) نمایش می دهد. به این تکنیک tracing می گویند. مانند مثال زیر:

behrad@debian:~$ ./trouble.bash
+ number=1
+ '[' 1 = 1 ']'
+ echo 'Number equals 1'
Number equals 1

علاوه بر آن می توانید از دستور set برای فعال کردن tracing در اسکریپت خود استفاده کنید. از set -x برای فعال کردن و set +x برای غیر فعال کردن tracing استفاده کنید. برای مثال:

#!/bin/bash

number=1

set -x
if [ $number = "1" ]; then
    echo "Number equals 1"
else
    echo "Number does not equal 1"
fi
set +x



ورودی صفحه کلید و عملیات محاسباتی

تا حالا اسکریپت ما حالت محاوره ای (interactive) نداشت. بنابر این نیاز به هیچ ورودی از طرف کاربر نداشتیم. در این درس می بینیم که اسکریپت شما چطور یک پرسش را در خواست می کند ٬ جواب را گرفته و از آن استفاده می کند.



read

برای گرفتن ورودی از صفحه کلید باید از دستور read استفاده کنید. دستور read یک ورودی از صفحه کلید دریافت می کند و آنرا به یک متغیر نسبت می دهد. برای مثال:

#!/bin/bash

echo -n "Enter some text > "
read text
echo "You entered: $text"

همانطور که مشاهده می کنید در خط ۳ منتظر ورودی هستیم. توجه داشته باشید که -n به همراه دستور echo باعث می شود که پس از چاپ جمله مورد نظر٬ به خط جدید نرود.

سپس٬ آرگومان text را به دستور read داده ایم. کاری که این دستور می کنپ آن است که منتظر می ماند تا کاربر ٬چیزی را تایپ کند و سپس کلید Enter را فشار دهد. سپس انچه کاربر نوشته است را به متغیر text نسبت می دهد.

در زیر اسکریپت در حال اجرا نشان داده شده است:

behra@debian:~$ read_demo.bash
Enter some text > this is some text
You entered: this is some text

اگر به دستور read هیچ آرگومانی به عنوان متغیر ورودی معرفی نگردد٬ از متغیر محیطی REPLY استفاده خواهد کرد.

#!/bin/bash

echo -n "Enter some text > "
read
echo "You entered: $REPLY"

دستور read دارای چندین گزینه است. دو تا از مورد توجه ترین آنها t- و s- هستند. گزینه -t ودر ادامه آن عددی بر حسب ثانیه باعث می شود که دستور تا یک زمان مشخص منتظر ورودی از طرف کاربر بماند و پس از پایان یافتن زمان انتظار به ادامه اسکریپت بپردازد. این گزینه زمانی مفید است که ما می خواهیم ٬ حتی اگر کاربر به سوالی پاسخ نداد ٬ اجرای اسکریپ ادامه پیدا کند. در زیر مثالی از گزینه t- آمده است:

#!/bin/bash

echo -n "Hurry up and type something! > "
if read -t 3 response; then
    echo "Great, you made it in time!"
else
    echo "Sorry, you are too slow!"
fi

گزینه -s باعث می شود تا آنچه کاربر تایپ می کند نمایش داده نشود. این گزینه برای مواقعی که شما از کاربر کلمه عبور یا دیگر اطلاعات امنیتی را دریافت می کنید مفید است.



عملیات محاسباتی

از آنجایی که ما با یک کامپیوتر کار می کنیم٬ طبیعی است که انتظار داشته باشیم تا چند عمل ساده محاسباتی را به کمک آن انجام دهیم. شل یک سری ابزار برای محاسبت بر روی عدد صحیح در اختیار قرار می دهد.

عدد صحیح چیست؟ عدد صحیح یعنی تمام اعداد مانند :1 ,2 ,456 ,287-و .... . در ضمن اعداد کسری را شامل نمی شود. اگر شما می خواهی با مقادیر کسری کار کنید باید از برنامه دیگری به نام bc در اسکریپت خود کمک بگیرید. این این دستور در این راهنما تشریح نخواهد شد.

اجازه دهید از خط فرمان به عنوان یک محاسبه گر استفاده کنیم. شما می توانید مانند زیر عمل کنید:

behrad@debian:~$ echo $((2+2))

همان طور که مشاهده می کنید زمانی که شما یک جمله محاسباتی را درون پرانتز قرار دهید٬ شل عملیات محاسباتی را بر روی آن انجام می دهد.

در ضمن فضای خالی بین عملوند ها و عملگر ها اهمیتی ندارد.

behrad@debian:~$ echo $((2+2))
4
behrad@debian:~$ echo $(( 2+2 ))
4
behrad@debian:~$ echo $(( 2 + 2 ))
4

شل می تواند انواع مختلفی از عملیات معمول و غیر معمول را انجام دهد. به مثال زیر توجه کنید:

#!/bin/bash

first_num=0
second_num=0

echo -n "Enter the first number --> "
read first_num
echo -n "Enter the second number -> "
read second_num

echo "first number + second number = $((first_num + second_num))"
echo "first number - second number = $((first_num - second_num))"
echo "first number * second number = $((first_num * second_num))"
echo "first number / second number = $((first_num / second_num))"
echo "first number % second number = $((first_num % second_num))"
echo "first number raised to the"
echo "power of the second number   = $((first_num ** second_num))"

توجه داشته باشید که استفاده از $ در درون جمله محاسباتی ضرورتی ندارد. مانند "first_num + second_num"

این برنامه را اجرا کنید و ببنید که با تقسیم و اعداد بزرگ چطور برخورد می کند(به خاطر داشته باشید که تقسیم اعداد صحیح است.) شماره های که خیلی بزرگ هستند ٬مانند همانند کیلومتر شمار اتومبیل٬ زمانی که بیشتر از اندازه ای که طراحی شده اند می شمارد ٬ سرریز می کندو از اول شروع به شمارش می کند. اما به خاط طراحی عدد صحیح در حافظه٬ ابتدا همه اعداد منفی می شود. تقسیم بر صفر (که از لحاظ ریاضی غیر قابل قبول است ) موجب بروز خطا می شود.

من مطمئنم که شما چهار عملگر اول یعنی ٬جمع ٬تفرق ٬تقسیم و ضرب را می شناسید ولی پنجمی ناآشناست. علامت ٪ به معنی باقیمانده است. این عملوند عمل تقسیم را انجام می دهد٬ اما به جای نتیجه تقسیم٬ باقیمانده آن را نمیش می دهد. شاید این عملوند زیاد مفید به نظر نیاید اما در حقیقت کمک بسیار بزرگی در هنگام نوشتن برنامه است. برای مثال٬ وقتی باقیمانده تقسیم صفر است٬ به این معنی است که عدد اول مضرب صحیحی از عدد دوم است و می تواند بسیار مفید باشد:

#!/bin/bash

number=0

echo -n "Enter a number > "
read number

echo "Number is $number"
if [ $((number % 2)) -eq 0 ]; then
    echo "Number is even"
else
    echo "Number is odd"
fi

یا در مثال زیر که مقدار ثانیه دلخواه را به ساعت و دقیقه تبدیل می کند:

#!/bin/bash

seconds=0

echo -n "Enter number of seconds > "
read seconds

hours=$((seconds / 3600))
seconds=$((seconds % 3600))
minutes=$((seconds / 60))
seconds=$((seconds % 60))

echo "$hours hour(s) $minutes minute(s) $seconds second(s)"



کنترل جریان – بخش دوم

کلاه خودتون رو بگیرید این فصل می خواهد از اون فصل های بزرگ باشه!!



شاخه بندی بیشتر

در قسمت قبل کنترل جریان نحوه استفاده از دستور if را و چگونگی کنترل اجرای برنامه با توجه به شرط ها را آموختید. در برنامه نویسی این نوع از جریان برنامه را شاخه بندی یا branching می نامند٬ زیرا که مانند طی کردن یک درخت است. شما بر سر انشعاب بر روی درخت می روید و با توجه به شروط وارد یک شاخه می شوید.

دومین نوع از شاخه بندی case نامیده می شود. یک case دارای چندین شاخه انتخاب است.بر خلاف شاخه های ساده که شما یکی از دو مسیر ممکن را انتخاب می کنید٬ یک case از چندین خروجی با توجه به ارزیابی شرط پشتیبانی می کند.

این نوع از شاخه را می توانید با استفاده از چندین if بسازید. در مثال زیر ما چندین ورودی از کاربر را بررسی می کنیم:

#!/bin/bash

echo -n "Enter a number between 1 and 3 inclusive > "
read character
if [ "$character" = "1" ]; then
    echo "You entered one."
else
    if [ "$character" = "2" ]; then
        echo "You entered two."
    else
        if [ "$character" = "3" ]; then
            echo "You entered three."
        else
            echo "You did not enter a number"
            echo "between 1 and 3."
        fi
    fi
fi

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

خوشبختانه شل چندین راه حل زیبا برای این مشکل دارد. شل دستور داخلی(built-in) را در اختیار ما قرار می دهد٬ که می تواند برای نوشتن برنامه ای مشابه بالا استفاده شود:

#!/bin/bash

echo -n "Enter a number between 1 and 3 inclusive > "
read character
case $character in
    1 ) echo "You entered one."
        ;;
    2 ) echo "You entered two."
        ;;
    3 ) echo "You entered three."
        ;;
    * ) echo "You did not enter a number"
        echo "between 1 and 3."
esac

شکل استفاده از دستور case به صورت زیر است:

case word in
    patterns ) statements ;;
esac

در صورتی که word با یک pattern مطابقت داشته باشد٬ case قسمت statement مربوطه را اجرا می کند. Pattern ها می توانند کلمات واقعی یا wildcard باشند.شما می توانید چندین pattern جدا شده توسط علامت | داشته باشید. در زیر چندین مثال از استفاده از wildcard آورده شده است:

#!/bin/bash

echo -n "Type a digit or a letter > "
read character
case $character in
            # Check for letters
    [a-z] | [A-Z] ) echo "You typed the letter $character"
            ;;

            # Check for digits
    [0-9] )     echo "You typed the digit $character"
            ;;

            # Check for anything else
    * )         echo "You did not type a letter or a digit"
esac

به الگوی "*” توجه کنید. این pattern یا الگو با همه چیز مطابقت دارد. بنابراین در صورتی که pattern های قبلی با ورودی مطابقت نداشته باشند٬ statements مربوط به این pattern اجرا می شود. استفاده از این گزینه در آخر همه الگو ها می تواند بسیار هوشمندانه باشد و ورودی های غیر معتبر را کشف کند.



حلقه ها

آخرین نوع از برنامه های کنترل جریان که توضیح می دهم٬ حلقه ها هستند. حلقه ها بخشی از برنامه شما را با توجه به یک شرط مرتبا اجرا می کنند. شل سه دستور برای حلقه در اختیار شما قرار می دهد: while, until و for .در این درس ما while و until را توضیح خواهیم داد و for را به درس بعد واگذار می کنیم.

دستور while باعث می شود یک قطعه کد٬ تا زمانی که شرط صحیح است٬ مرتبا اجرا شود.در زیر مثالی از برنامه ایست که از صفر تا ۹ می شمارد:

#!/bin/bash

number=0
while [ $number -lt 10 ]; do
    echo "Number = $number"
    number=$((number + 1))
done

در خط ۳ ما یک متغیر به نام number ساخته ایم و مقدار اولیه آن را صفر قرار دادیم. بعد از آن حلقه while را شروع کرده ایم. همانطور که مشاهده می کنید٬ یک شزط تعیین کرده ایم که مقدار number را آزمایش می کند. در مثال ما٬ شرط آن است که مقدار number کمتر از ۱۰ باشد.

به کلمه do در خط ۴و کلمه done در خط ۷ توجه کنید. این دو آن قسمت از کد که قرار است تا زمان برقراری شرط تکرارشود را احاطه می کنند.

در بسیاری موارد٬ قطعه کدی که دائما در حلقه تکرار می شود٬ در آخر شرط را تغییر داده و باعث پایان خلقه می شود٬ در غیر این صورت یک شرط پایان برای حلقه باید در نظر بگیریم٬ والا حلقه هیچگاه پایان نمی یابد.

در مثال٬ قطعه کد مقدار number را به خروجی می دهد(دستور echo در خط ۵) و هر دفعه یک واحد آن را اضافه می کند.هر زمان که قطعه کد کامل اجرا می گردد٬ یک بار شرط آزمایش می شود. بعد از ده بار از سر گیری حلقه٬ number ده واحد افزایش می یابد و شرط دیگر صحیح نیست. در این لحظه جریان برنامه به done منتقل می شود و چون done آخر این خط برنامه ما است٬‌برنامه پایان می یابد.



دستور until با روشی عینا مشابه کار می کند٬ تنها٬ قطعه کد تا زمانی تکرار می شود که شرط اشتباه باشد. در مثال زیر توجه کنید که چطور شرط نسبت به مثال while تغییر یافته٬ تا هما نتیجه را به ما بدهد:

#!/bin/bash

number=0
until [ $number -ge 10 ]; do
    echo "Number = $number"
    number=$((number + 1))
done



ساختن یک منو

یکی از راههای معمول برای ایجاد رابط کاربری برای محیط متنی استفاده از منو است. یک منو لیستی از انتخاب هاست که کاربر می تواند یکی را انتخاب کند.

در مثال زیر ما از اطلاعات جدیدمان از حلقه ها و case برای سلخت منو استفاده کرده ایم:

#!/bin/bash

selection=
until [ "$selection" = "0" ]; do
    echo ""
    echo "PROGRAM MENU"
    echo "1 - display free disk space"
    echo "2 - display free memory"
    echo ""
    echo "0 - exit program"
    echo ""
    echo -n "Enter selection: "
    read selection
    echo ""
    case $selection in
        1 ) df ;;
        2 ) free ;;
        0 ) exit ;;
        * ) echo "Please enter 1, 2, or 0"
    esac
done

هدف از استفاده از حلقه until در این برنامه آن است که هر گاه عمل انتخاب انجام شد٬ مجددا منوی انتخاب ظاهر شود. حلقه تا زمانی که گزینه 0 انتخاب شود٬ ادامه پیدا می کند. توجه کنید که برنامه چطور در برابر ورودی های غیر معتبر کاربران محافظت شده است.

برای آنکه برنامه زمانی که اجرا می شود ظاهر مناسب تری داشته باشد می توانیم به آن یک تابع اضافه کنیم که از کاربر بخواهد بعد از آنکه هر انتخاب کامل شد کلید Enter را فشار دهد٬ و قبل از آنکه منو مجددا ظاهر گردد صفحه نمایش پاک شود.

#!/bin/bash

function press_enter
{
    echo ""
    echo -n "Press Enter to continue"
    read
    clear
}

selection=
until [ "$selection" = "0" ]; do
    echo ""
    echo "PROGRAM MENU"
    echo "1 - display free disk space"
    echo "2 - display free memory"
    echo ""
    echo "0 - exit program"
    echo ""
    echo -n "Enter selection: "
    read selection
    echo ""
    case $selection in
        1 ) df ; press_enter ;;
        2 ) free ; press_enter ;;
        0 ) exit ;;
        * ) echo "Please enter 1, 2, or 0"; press_enter
    esac
done



زمانی که کامپیوتر هنگ می کند

همه ما تجربه هنگ کردن یک برنامه(یا کل سیستم)را داریم. هنگ کردن زمانی است که برنامه ناگهانی متوقف می شود و دیگر پاسخگو نیست. زمانی که شما فکر می کنید برنامه به طور کامل متوقف شده است٬ در بیشتر موارد٬ هنوز در حال اجرا است. اما منطق برنامه در یک حلقه بی پایان قرار گرفته است.

فرض کنید شما یک دستگاه خارجی مانند دیسک usb به سیستم خود متصل کرده ایدو فراموش کرده اید آن را روشن کنید. شما سعی می کنید از دستگاه استفاده کنید ولی برنامه شما هنگ می کند. زمانی که این موضوع اتفاق می افتد شما می توانید گفتگوی زیر٬ بین برنامه و رابط دستگاه را تصور کنید:

Application:    Are you ready?
Interface:  Device not ready.

Application:    Are you ready?
Interface:  Device not ready.

Application:    Are you ready?
Interface:  Device not ready.

Application:    Are you ready?
Interface:  Device not ready.

و همیطور ادامه پیدا می کند.

یک برنامه خوب جلوی یک چنین شرایطی را با قرار دادن یک timeout در برنامه می گیرد. این به آن معنی است که حلقه نیز تعدا تلاشها را بشمارد و یا زمانی که باید منتظر انجام کار شودرا محاسبه کند. اگر تعداد تلاشها و یا زمان مجاز برای انجام کار به سر آمد٬ از حلقه خارج شدهو برنامه یک پیغام خطا صادر کندو خارج شود.



ترجمه : بهراد اسلامی فر

behrad_es@yahoo.com

www.giveme5.ir