فصل 7 حلقه for

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

اینگونه کار‌ها را به استفاده از حلقه‌ها اجرا می‌کنند.

  • حلقه for
$ for i in 1 2 3
> do echo $i
> done
1
2
3

می‌تواینم همین کد را تک خطی نیز بنویسیم

$ for i in 1 2 3; do echo $i; done
1
2
3

حلقه for سه بخش دارد که اگر یک خطی بنویسیم باید آن‌ها را با ; جدا کنیم.

  1. اعلامیه (Declaration):

در بخش for i in 1 2 3; به ترتیب موارد بعد از in را به متغییر i اختصاص می‌دهد. شماره‌هایی که بعد از in آمده‌اند را لیست (list) می‌نامند.

  1. بدنه (Body):

در بخش do echo $i; هر دستوری که بعد از do نوشته شود برای هر مورد می‌تواند تکرار شود. برای مثال اینجا به ترتیب هر شماره با تابع echo چاپ می‌شود.

  1. اتمام (End):

در این بخش done تنها شامل یک کلمه است که به معنای خارج شدن از حلقه بعد از اجرا برای همه موارد درون لیست است.

می‌توان بخش‌های بیشتری را با گذاشتن ; انتهای آن به بدنه اضافه نمود.

$ for i in 1 2 3; do echo $i; echo “You just printed the number $i; done
1
“You just printed the number 1”
2
“You just printed the number 2”
3
“You just printed the number 3”

مثلا اگر ما تعدادی اسامی به صورت sub-01 داشته باشیم می‌توانیم به زیر برای هر یک یه حلقه ایجاد کنیم

$ for i in sub-01 sub-02 … sub-26; do echo $i; done
sub-01
sub-02
…
sub-26

اما یک روش ساده تر برای نوشتن کد این است که از دستور seq 1 10 برای ایجاد لیستی از اعداد یک تا ده استفاده کنیم تا از نوشتن کد تکراری جلوگیری کنیم.

$ for i in `seq 1 26`; do echo “sub-$i; done
sub-1
sub-2
…
sub-26

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

$ for i in `seq -w 1 26`; do echo “sub-$i; done
sub-01
sub-02
…
sub-26

با استفاده از دستور ls می‌توانیم بر روی لیستی از فایل‌های درون یک پوشه (مثلا پوشه خانه ~/ ) حلقه اجرا کنیم.

$ for i in `ls ~/`; do echo $i; done
bin
Desktop
Documents
Downloads
…