آموزش اسکریپت نویسی لینوکس (حلقه های شرطی while و until و for)
آموزش اسکریپت نویسی لینوکس (حلقه های شرطی while و until و for)
تا اینجا آموختهاید چگونه برخی تصمیمگیری های اساسی در اسکریپتهایتان را بسازید.
اگر چه، برای انجام همه انواع وظایفی که ممکن است از اسکریپت بخواهیم کافی نمیباشد.
گاهی اوقات نیاز به تکرار برخی کارها داریم.
برای همین، کاربرد یک حلقه لازم است. دو نوع اصلی از حلقه (به اضافه نوع دیگری) وجود دارد.
استفاده از نوع صحیح حلقه به شما در نگهداری خوانایی و قابلیت پشتیبانی اسکریپتهایتان کمک میکند.
دو نوع اساسی حلقهها while و for میباشند،
حلقه while نوع دیگری دارد که until نامیده شده است، که به سادگی بررسی را برعکس انجام میدهد،
و حلقه for در دو قالب متفاوت ظاهر میشود.
در اینجا خلاصهای از آنها آورده شده است:
- while command: تا وقتی که command به طور موفقی اجرا میشود (کد خروج صفر است)، تکرار میشود.
- until command: مادامی که command به طور ناموفق اجرا گردد (کد خروج صفر نباشد)، تکرار میشود.
- for variable in words: حلقه برای هر یک از words که به نوبت در متغیر variable قرار میگیرند، تکرار میشود.
- :for ((expression; expression; expression))با اجرای اولین عبارت حسابی شروع میکند، تا موقعی که ارزیابی دومین عبارت حسابی موفق است حلقه تکرار میشود و در پایان هر حلقه عبارت حسابی سوم انجام میشود.
هر شکل از حلقهها با کلمه کلیدی do دنبال میشود،
پس از آن یک یا چند فرمان در بدنه، بعد هم کلمه کلیدی done، کلمه های کلیدی do و done مشابه then و fi) if و elif یا else احتمالی) در ساختار دستور if که قبلاً دیدیم، میباشند.
کار آنها این است که به ما بگویند حلقه از کجا شروع و به کجا ختم میشود.
در عمل، حلقهها برای انواع مختلفی از وظایف به کار میروند.
-
حلقه for برای موقعی مناسب است که لیستی داریم و میخواهیم عناصر آن را به طور ترتیبی به کار ببریم.
-
حلقه while مناسب وقتی است که به طور دقیق نمیدانیم چند مرتبه عملی باید تکرار شود
و میخواهیم تا رسیدن به موردی که در انتظار آن هستیم تکرار انجام شود.
در اینجا چند مثال برای تشریح تفاوتها و همچنین شباهتهای حلقهها میآوریم:
دو مثال اول که ساده است و اما مثال آخر:
همانطور که قبلا اشاره کردیم، for لیستی از کلمات را گرفته و هر یک از آنها را در متغیر شاخص حلقه میگذارد،
هر دفعه یکی و سپس بدنه حلقه را با آن اجرا میکند.
قسمت جالب آن است که BASH چطور تصمیم میگیرد که کلمات کدام هستند.
BASH کاراکترهای بین کلمه کلیدی in و انتهای سطر را میگیرد و آنها را به کلمات تفکیک مینماید.
این تفکیک نسبت به فاصله و tabها انجام میشود، درست مانند تفکیک شناسهها.
اما اگر هر جایگزینی نقلقولی نشدهای آنجا باشد، آن هم به کلمات تفکیک میگردد
(با استفاده از محتوای متغیر IFS) تمام این کلمات تفکیک شده، عناصر تکرار میشوند.
در نتیجه، خیلی مراقب باشید که اشتباه زیر را مرتکب نشوید:
شما از قبل نسبت به نقلقولی کردن $file در دستور rm آگاه بودید، اما در اینجا چه چیزی اشتباه است؟
BASH جایگزینی دستور ($(ls *.mp3)) را بسط میدهد، آن را با خروجی دستور تعویض میکند
و بعد تفکیک کلمه را روی آن انجام میدهد (به علت آنکه نقلقولی نیست) در واقع Bash این عبارت را اجرا میکند.
.for file in The best song in the world.mp3
احتمالا می گویید که آن را نقلقولی میکنم؟
اجازه دهید فایل دیگری اضافه کنیم:
نقلقولها به راستی از فضای سفید در نام فایلهای شما محافظت میکنند، اما چیزی بیش از آن انجام میدهند.
نقلقولها از تمام فضاهای سفید خروجی فرمان ls محافظت خواهند کرد.
شاید سوال بپرسید که راهی وجود ندارد که BASH بتواند تشخیص بدهد کدام بخشهای خروجی فرمان ls نام فایلها را نمایندگی میکنند.
ببینید خروجی فرمان ls یک رشته ساده است و BASH با آن به همین عنوان رفتار میکند.
بعد for تمام خروجی نقلقولی شده را در متغیرi قرار میدهد و دستور rm را با آن اجرا میکند.
بنابراین چه کار بکنیم؟ به طوری که قبلا پیشنهاد نمودیم، می توانید از جانشینها استفاده کنید:
for file in *.mp3
“do rm “$file <
done <
حالا، BASH میداند که با نام فایلها سروکار دارد و نام فایها را میشناسد
و بنابراین به طور مطلوبی آنها را تفکیک میکند.
نتیجه بسط جابشین چنین است:
.for file in “The best song in the world.mp3” “The worst song in the world.mp3″
حالا بیایید به حلقه while بپردازیم.
حلقه while به خاطر ظرفیتش در اجرای دستورات تا موقع وقوع موضوع مورد نظر، خیلی جالب است.
در اینجا چند مثال که نشان میدهد چگونه حلقه while غالباً به کار میرود:
حلقه until خیلی به ندرت استفاده میشود، فقط به علت آنکه تا حد بسیار زیادی مشابه حلقه while میباشد.
میتوانستیم آخرین مثال را با حلقه until به صورت زیر بنویسیم:
بالاخره، از دستور داخلی continue برای پرش به جلو بدون اجرای بقیه بدنه و اجرای دور بعدی تکرار حلقه
و دستور داخلی break برای پریدن به خارج از حلقه و ادامه دستورات پس از حلقه در اسکریپت، میتوانید استفاده کنید.
این دستورات با هر دو حلقه for و while کار میکنند.
جهت مشاهده دوره های آموزشی بر روی این لینک کلیک نمایید.
جدیدترین اخبار مجموعه فراز نتورک را در این صفحه اجتماعی دنبال کنید.
نویسنده: موسی رشوند
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.