چنانچه نیاز داشته باشیم تا کامندی را بارها و بارها تکرار کنیم، میبایست با مفهومی تحت عنوان Loop (لوپ یا حلقه) آشنایی داشته باشیم. معمولاً اجرای لوپها تا زمانی ادامه مییابد که شرطی از پیش تعریف شده برابر با True یا False باشد. در اسکریپتنویسی Shell معمولاً ۳ نوع لوپ استفاده میشود که عبارتند از: while ،for و until.
آشنایی با لوپی از جنس for در اسکریپتنویسی بش
for زمانیهایی استفاده میشود که بخواهیم عملی را روی تکتک آیتمهای یک آرایه یا لیست انجام دهیم تا در نهایت کلیهٔ آیتمهای آن لیست به پایان برسند. سینتکس این نوع لوپ به شرح زیر است:
for variable-name in list
do
execute one iteration for each item in the list until the list is finished
done
در تفسیر کد فوق بایستی بگوییم که variable-name را میتوان با هم نام دلخواهی جایگزین کرد و این در حالی است که list هم میبایست حاوی لیستی از آیتمهای مختلف باشد (این آیتمها میتوانند اعداد، استرینگ و … باشند). برای روشنتر شدن نحوهٔ کاربرد لوپهایی از جنس for، فایلی میسازیم تحت عنوان for.sh و کدهای زیر را داخل آن مینویسیم:
#!/bin/sh
for i in 1 2 3 4 5
do
echo "Looping number $i"
done
همانطور که مشخص است، در خط اول مسیر مفسر bash را دادهایم و در خط دوم ابتدا کلیدواژهٔ for را نوشته سپس نام دلخواهی برای متغیر خود همچون i (ابتدای حرف Index به معنی اندیس) در نظر میگیریم. در ادامه، میبایست به این لوپ دستور دهیم تا داخل یک لیست شروع به گشتن کند؛ برای همین منظور، کلیدواژهٔ in را نوشته سپس اعداد ۱ الی ۷ را به عنوان آرایهای از آیتمهای مختلف در نظر میگیریم. در ادامه، ابتدا کلیدواژهٔ do را نوشته سپس کامندی که تمایل داریم اجرا شود را مینویسیم که در این مثال استفاده از دستور echo برای چاپ کردن عبارت Looping number $i است که i$ هم همان متغیری است که پیش از این تعریف کردیم و در نهایت کلیدواژهٔ done را مینویسم که نشانگر پایان این لوپ است.
حال طبق روال گذشته، ابتدا این فایل را با استفاده از دستور chmod +x for.sh قابلاجرا کرده سپس آن را به صورت زیر اجرا میکنیم:
$ bash for.sh
Looping number 1
Looping number 2
Looping number 3
Looping number 4
Looping number 5
Looping number 6
Looping number 7
میبینیم که کامند "echo "Looping number $i به تعداد آیتمهای لیست ورودی، یعنی ۷ بار، تکرار شده و تا زمانی ادامه مییابد که دیگر هیچ آیتمی در لیست باقی نمانده باشد.
حال در مثال بعدی قصد داریم دستور شرطی if با حلقهٔ for را ادغام نماییم. برای این منظور، فایلی تحت عنوان for_and_if.sh ساخته و کدهای زیر را داخل آن مینویسیم:
#!/bin/sh
for i in {1..20}
do
if [ $i == 10 ]
then
echo "$i is the first half of the list"
else
echo "Looping number $i"
fi
done
در تفسیر کدهای فوق بایستی بگوییم که با ساختار جدید همچون {20..1} مواجه هستیم. این ساختار طیفی از اعداد مابین ۱ تا ۲۰ را ایجاد میکند. علاوه بر این، در خط ۴ شرط گذاشتهایم که اگر مقدار متغیر i$ برابر با ۱۰ بود، دستور "echo "$i is the first half of the list به معنی «۱۰ نیمی از این لیست است» چاپ شود و در غیر این صورت، دستور داخل else چاپ گردد. حال پس از اجرایی کردن این فایل، آنرا تست میکنیم:
$ bash for_and_if.sh
Looping number 1
Looping number 2
Looping number 3
Looping number 4
Looping number 5
Looping number 6
Looping number 7
Looping number 8
Looping number 9
10 is the first half of the list
Looping number 11
Looping number 12
Looping number 13
Looping number 14
Looping number 15
Looping number 16
Looping number 17
Looping number 18
Looping number 19
Looping number 20
میبینیم که این برنامه به درستی کار کرده و اعداد ۱ الی ۲۰ را نمایش میدهد.
آشنایی با لوپی از جنس while در اسکریپتنویسی بش
while مادامیکه شرط برابر با True باشد، ادامه یافته و دستورات در نظر گرفته شده را اجرا میکند. سینتکس این نوع لوپ به شرح زیر است:
while condition is true
do
Commands for execution
done
به عنوان condition (شرط) میتوان هر کامند یا اپراتوری را استفاده نمود که معمولاً مابین دو علامت [ ] قرار میگیرد. علاوه بر این، کامندهایی که تمامل داریم اجرا شوند را میبایست مابین ۲ کلیدواژهٔ do و done قرار دهیم. برای روشنتر شدن نحوهٔ بهکارگیری از لوپهایی از جنس while، فایلی تحت عنوان while.sh ساخته و کدهای زیر را داخل آن مینویسیم:
#!/bin/bash
counter=1
while [ $counter -le 10 ]
do
echo $counter
((counter++))
done
echo "All done"
در تفسیر کدهای فوق بایستی بگوییم که در خط ۲ متغیری تحت عنوان counter (شمارنده) ایجاد کرده و مقدار پیشفرض ۱ را هم برای آن در نظر گرفتهایم، در خط ۳ این شرط را در نظر گرفتهایم که اگر مقدار متغیر counter$ کوچکتر یا برابر با ۱۰ بود (le-)، این حلقه ادامه یابد. سپس در خط ۵ مقدار متغیر counter$ را چاپ کرده و در خط بعد هم با استفاده از (( )) و استفاده از علائم ++ یک واحد به مقدار متغیر counter$ اضافه میکنیم. حال پس از اجرایی کردن این فایل، آنرا تست میکنیم:
$ bash while.sh
1
2
3
4
5
6
7
8
9
10
All done
میبینیم که این حلقه تا زمانی که مقدار متغیر counter$ کوچکتر یا مساوی با عدد ۱۰ است ادامه یافته اما به محض False شدن شرط در نظر گرفته شده، از حلقه خارج خواهیم شد و در نهایت هم دستور "echo "All done چاپ میشود.
آشنایی با لوپی از جنس until در اسکریپتنویسی بش
until مادامیکه شرط در نظر گرفته شده برابر با False باشد، دستورات لوپ را اجرا میکند که با این تفاسیر، نقطهٔ مقابل لوپی از جنس while است. به عبارت دیگر، به محض آنکه شرط برابر با True شود، ما از لوپ خارج خواهیم شد. سینتکس این نوع لوپ به شرح زیر است:
until condition is false
do
Commands for execution
done
همچون while، دستوراتی را که میخواهیم داخل این نوع لوپ اجرا شوند را میبایست داخل کلیدواژگان do و done قرار دهیم. علاوه بر این، هرگونه کامند یا اپراتوری را هم میتوان به عنوان شرط برای until در نظر گرفت. به منظور روشنتر شدن نحوهٔ کاربرد until، فایلی تحت عنوان until.sh ساخته و کدهای زیر را داخل آن مینویسیم:
#!/bin/bash
counter=1
until [ $counter -gt 10 ]
do
echo $counter
((counter++))
done
echo "All done"
همانطور که ملاحظه میشود، ساختار بسیار شبیه به لوپی از جنس while است اما به عنوان شرط until، از اپراتور gt- به معنی «بزرگتر از» استفاده کردهایم.
قبلاً گفتیم که این نوع لوپ تا زمانی ادامه مییابد که شرط برابر با False باشد و به محض True شدن آن، از لوپ خارج خواهیم شد. حال یک بار این برنامه را پس از اجرایی کردن فایلش، تست میکنیم:
bash until.sh
1
2
3
4
5
6
7
8
9
10
All done
میبینیم که خروجی دقیقاً شبیه به خروجی فایل while.sh است با این تفاوت که در این برنامه شرط گذاشتهایم به محض اینکه مقدار متغیر counter$ بزرگتر از عدد ۱۰ شد، از لوپ خارج شده و ادامهٔ برنامه اجرا گردد.