چای ۵: اسکریپت نویسی Shell، بازه‌ها در حلقه for

به عنوان آدمی که ذره‌ای علاقه به طراحی و گرافیک داره، هیچوقت مخالف رابط‌های گرافیکی (GUI) نبوده و نیستم، اما انجام خیلی از کارها با استفاده از CLI به دلیل قابل برنامه‌نویسی بودن، به میزان بسیار زیادی راحت‌تر و سریع‌تره به‌خصوص کارهایی که قاعده‌مند و قابل تکرار هستند، مثل استفاده از GIT، ایجاد دایکتوری‌های تو‌درتو، تبدیل فایل‌ها و تحت تاثیر قرار دادن افراد!

در این قسمت از چای، خیلی کوتاه با استفاده از چند مثال، با عملگر بازه (range operator) در اسکریپت نویسی shell آشنا می‌شیم.


حلقه for

در حالت عادی نوشتن یک حلقه for در shell script به‌صورت زیر است:

#!/bin/bash
# Basic for loop

for (( c=1; c<=5; c++ ))
do  
   echo $c
done

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

❯ for ((c=1;c<=5;c++)); do echo $c; done

با اجرای این حلقه اعداد ۱ تا ۵ به‌صورت زیر چاپ می‌شوند:

1 
2 
3 
4 
5


حلقه for
حلقه for



عملگر بازه (range)

عملگر بازه‌ها نوشتن حلقه‌های for را ساده‌تر کرده و حتی این اجازه را می‌دهند که بدون نوشتن حلقه for، دستورات را تکرار کرده و نوشتن برنامه‌های تک-خطی (One-liner program) رو بسیار ساده‌تر می‌کنه.

فرمت و نحوه استفاده بازه‌ها به‌صورت زیر است:

# range operator (pseudo code)
{start..end..step}

به مثال‌های زیر توجه کنید:

چاپ اعداد بین ۱ تا ۱۰

# print numbers from 1 to 10
❯ for i in {1..10}; do echo $i; done
1 
2 
3 
4 
5 
6 
7 
8 
9 
10


چاپ اعداد فرد بین ۱ تا ۱۰

# print odd numbers from 1 to 10
❯ for i in {1..10..2}; do echo $i; done
1 
3 
5 
7 
9


استفاده از بازه‌ها بدون حلقه for

همانطور که گفته شد، از عملگر بازه‌ها می‌توان خارج از حلقه for نیز استفاده کرد؛ اینکار انعطاف‌پذیری زیادی به دستورات میده و اجازه میده بدون نوشتن حلقه for دستورات را تکرار کنیم. به مثال زیر دقت کنین:

چاپ اعداد بین ۱ تا ۱۰۰

❯ echo {1..100} 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100


ساختن دایرکتوری‌هایی با حروف الفبا

❯ mkdir {a..z}


ساختن دایرکتوری‌هایی با حروف الفبا
ساختن دایرکتوری‌هایی با حروف الفبا



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

❯ convert {a..b}{1..2}.png output%0d.jpg

در این مثال با استفاده از imagemagick تصاویر زیر رو از png به jpg تبدیل می‌کنیم:

تبدیل تصاویر a1، a2، b1 و b2 از png به jpg با استفاده از imagemagick
تبدیل تصاویر a1، a2، b1 و b2 از png به jpg با استفاده از imagemagick


با کنارهم گذاشتن چند بازه (range) می‌توان تمام جایگشت‌های ترکیب آن‌ها را تولید کرد.
در مثال فوق: a1, a2, b1, b2



برای آشنایی بیشتر و بهتر با اسکریپت‌نویسی shell این آموزش رو مطالعه کنید.


این پست، قسمت پنجم از چای، مجموعه‌ای در باب «چیزی که امروز یادگرفتم» است. باقی چای‌ها رو می‌تونید از اینجا مشاهده کنید و در مورد فلسفه‌ی این کار بخونید.