راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

تمرین ها »
« حلقه while

فصل 9: وظایف تکراری

فهرست مطالب

حلقه for
چگونه کار می‌کند؟
مثال‌ها
حلقه while
چیست؟
مثال‌ها
حلقه until
چیست؟
مثال
تغییر مسیر I/O و حلقه‌ها
تغییر مسیر ورودی
تغییر مسیر خروجی
Break و continue
فرمان داخلی break
فرمان داخلی continue
مثال‌ها
ایجاد منوها با فرمان داخلی select
کلیات
منوهای فرعی
فرمان داخلی shift
چه کار می‌کند؟
مثال‌ها
خلاصه
تمرین‌ها

چکیده

پس از به پایان بردن این فصل، قادر خواهید بود که

  • از حلقه‌های for و while و until استفاده کنید و تصمیم بگیرید که کدام حلقه مناسب کدام موقعیت است.

  • فرمان‌های داخلی break و continue از Bash را به کار ببرید.

  • با استفاده از دستور select اسکریپت‌هایی بنویسید.

  • اسکریپت‌هایی بنویسید که تعداد شناسه‌های متغیری دریافت کند.

حلقه for

چگونه کار می‌کند؟

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

دستور زبان این حلقه به این شکل است:

for NAME [in LIST ]; do COMMANDS; done

اگر ‎ [in LIST]‎ در ترکیب حاضر نباشد، با جمله ‎ in $@‎ جایگزین می‌شود و for دستورات COMMANDS را هر بار برای یکی از پارامترهای موضعی برقرار شده، اجرا می‌کند( بخشی به نام«پارامترهای خاص» و بخشی به نام«بررسی شناسه‌های خط‌فرمان» را ملاحظه کنید).

کد برگشتی، کد خروج آخرین فرمان اجرا شده می‌باشد. اگر هیچ فرمانی اجرا نشده باشد، چون‌که LIST به هیچ موردی بسط نیافته است، کد برگشتی صفر است.

NAME می‌تواند هر نام متغیری باشد، اگر چه خیلی اوقات از i استفاده می‌شود. LIST می‌تواند لیستی از کلمات، رشته‌ها یا اعداد باشد که که به صورت لفظی یا تولید شده در اثر اجرای یک فرمان باشند. COMMANDS برای اجرا می‌تواند هر دستور سیستم عامل، اسکریپت، برنامه یا دستورات پوسته باشد. در اولین اجرای حلقه، NAME برابر اولین مورد در LIST تنظیم می‌شود. دومین مرتبه، مقدار آن برابر دومین مورد از لیست قرار می‌گیرد، و به همین ترتیب. حلقه تا موقعی که NAME هر یک از مقادیر LIST را گرفته باشد و موردی در LIST باقی نمانده باشد، تکرار می‌شود.

مثال‌ها

استفاده از جایگزینی فرمان برای تعیین اقلام LIST

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

[carol@octarine ~/articles] ls *.xml
file1.xml  file2.xml  file3.xml

[carol@octarine ~/articles] ls *.xml > list

[carol@octarine ~/articles] for i in `cat list`; do cp "$i" "$i".bak ; done

[carol@octarine ~/articles] ls *.xml*
file1.xml  file1.xml.bak  file2.xml  file2.xml.bak  file3.xml  file3.xml.bak

این یکی فایل‌های دایرکتوری ‎ /sbin که فقط از نوع متن ساده هستند و اسکریپت‌های احتمالی را لیست می‌کند:

for i in `ls /sbin`; do file /sbin/$i | grep ASCII; done

استفاده از محتوای متغیرها برای تعیین اقلامLIST

مورد پایین اسکریپت کاربردی ویژه‌ای برای تبدیل فایل‌های HTML مطابق یک قالب معین به فایل‌های PHP می‌باشد. The conversion is done by تبدیل با بیرون کشیدن ۲۵ سطر اول و ۲۱ سطر آخر، جایگزینی این سطرها با دو(tag) دستور PHP که سطرهای سرآیند و پایانی را فراهم می‌کنند:

[carol@octarine ~/html] cat html2php.sh
#!/bin/bash
# specific conversion script for my html files to php
LIST="$(ls *.html)"
for i in "$LIST"; do
     NEWNAME=$(ls "$i" | sed -e 's/html/php/')
     cat beginfile > "$NEWNAME"
     cat "$i" | sed -e '1,25d' | tac | sed -e '1,21d'| tac >> "$NEWNAME"
     cat endfile >> "$NEWNAME"
done

نظر به اینکه ما در اینجا شمارش سطر انجام نمی‌دهیم، راهی برای دانستن شماره سطری که از آنجا تارسیدن به انتها شروع به حذف کنیم، نیست. این مشکل با استفاده از tac، که سطرها را در فایل برعکس می‌کند، حل شده است.

[Tip]فرمان basename

به جای استفاده از sed جهت تعویض پسوند html با php، استفاده از فرمان basename پاکیزه‌تر خواهد بود. برای اطلاعات بیشتر صفحه‌های manرا بخوانید.

[Warning]کاراکترهای عجیب

اگر شمابسط لیست‌ها به نام فایل‌های دارای فاصله و سایر کاراکترهای غیرعادی را انجام دهید، با مشکلاتی مواجه خواهید شد. یک ساختار بیشتر مطلوب برای تهیه لیست، استفاده از ویژگی جانشینی( globbing ) پوسته است، مانند این:

for i in $PATHNAME/*; do
	commands
done

تمرین ها »
« حلقه while
ترجمه محمود پهلوانی