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

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

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

تمرین ها »
« گرفتن ورودی کاربر

فصل 8: نوشتن اسکریپت‌های محاوره‌ای

فهرست مطالب

نمایش پیغام‌های کاربری
محاوره‌ای است یا خیر؟
کاربرد دستور داخلی echo
دریافت ورودی از کاربر
کاربرد دستور داخلی read
نمایش اعلان برای ورودی کاربر
تغییر مسیر و توصیف‌گرهای فایل
فایل ورودی و خروجی
خلاصه
تمرین‌ها

چکیده

در این فصل صحبت خواهیم نمود که چگونه در اسکریپت‌هایمان با کاربر ارتباط متقابل داشته باشیم:

  • چاپ پیغام‌های کاربرمحور و توضیحات

  • دریافت ورودی از کاربر

  • اعلان برای ورودی کاربر

  • کاربرد توصیف‌گرهای فایل برای خواندن و نوشتن فایل‌های چندگانه

نمایش پیغام‌های کاربر

محاوره‌ای است یا خیر؟

برخی اسکریپت‌ها بدون هیچگونه ارتباط با کاربر اجرا می‌شوند. مزایای اسکریپت‌های غیر محاوره‌ای عبارتند از:

  • اسکریپت در هر نوبت به طریق قابل پیش‌بینی اجرا می‌شود.

  • اسکریپت می‌تواند در پس‌زمینه اجرا شود.

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

  • اسکریپت‌ها می‌توانند انعطاف‌پذیرتر ساحته شوند.

  • کاربران می‌توانند در حالیکه اسکریپت اجرا می‌شود آن را شخصی‌سازی کنند یا و یا روش‌های متفاوتی در رفتار آن ایجاد کنند.

  • اسکریپت می‌تواند همانطور که در حال اجرا می‌باشد پیشرفت خود را گزارش کند.

موقع نوشتن اسکریپت‌های محاوره‌ای، هرگز از توضیحات پرهیز نکنید. اسکریپتی که پیغام‌های مناسبی چاپ می‌کند خیلی بیشتر کاربرپسند است و آسانتر می‌تواند اشکال‌یابی شود. یک اسکریپت ممکن است کاری را به طور کامل انجام دهد، اما اگر به کاربر اطلاع ندهد که چه می‌کند، شما تماس‌های پشتیبانی زیادی خواهیدداشت. بنابراین پیغام‌هایی که به کاربر یگویدبرای خروجی منتظر باشد چون محاسباتی در حال انجام است، ضمیمه کنید. اگر میسر است سعی کنید به کاربر اشاره‌ای در مورد اینکه چه مدت باید در انتظار باشد ارائه کنید. در حال انجام وظیفه معینی به طور معمول زمان انتظار طولانی است، شاید بهتر باشد در خروجی اسکریپت گردآوری برخی نشانه‌های پردازشی ملاحظه شود.

همچنین موقعی که به کاربر اعلانی برای ورودی می‌دهید،بهتر است کمی اطلاعات اضافه در مورد نوع داده‌ای که باید وارد کند، ارائه کنید. این مطلب به خوبی مقابله شناسه‌ها با پیغام کاربردی همراه را اعمال می‌کند.

Bash دارای دستورات echo و printf جهت تهیه توضیحات برای کاربران می‌باشد، و اگر چه شما حداقل در حال حاضر بااستفاده دستور echo آشنا می‌باشید، در بخش بعد ما چند مثال بیشتر را مطرح خواهیم نمود.

کاربرد دستور داخلی echo

دستور داخلی echo شناسه‌هایش را که با فاصله از یکدیگر جداشده‌اند و با یک کاراکتر سطر جدید خاتمه می‌یابند در خروجی می‌نویسد. کد برگشتی آن همیشه صفر است. echo یک جفت گزینه می‌پذیرد:

  • ‎-e‎: کاراکترهای پوشش یافته با \ را تفسیر می‌کند.

  • ‎-n‎: انتقال به سطر جدید را موقوف می‌کند.

به عنوان یک مثال از افزودن توضیحات، مثال‌های ‎ feed.sh ‎ و ‎penguin.sh‎ از بخشی به نام«بررسی شناسه‌های خط‌فرمان» قدری بهسازی می‌کنیم:

michel ~/test> cat penguin.sh
#!/bin/bash

# This script lets you present different menus to Tux.  He will only be happy
# when given a fish.  To make it more fun, we added a couple more animals.

if [ "$menu" == "fish" ]; then
  if [ "$animal" == "penguin" ]; then
    echo -e "Hmmmmmm fish... Tux happy!\n"
  elif [ "$animal" == "dolphin" ]; then
    echo -e "\a\a\aPweetpeettreetppeterdepweet!\a\a\a\n"
  else
    echo -e "*prrrrrrrt*\n"
  fi
else
  if [ "$animal" == "penguin" ]; then
    echo -e "Tux don't like that.  Tux wants fish!\n"
    exit 1
  elif [ "$animal" == "dolphin" ]; then
    echo -e "\a\a\a\a\a\aPweepwishpeeterdepweet!\a\a\a"
    exit 2
  else
    echo -e "Will you read this sign?!  Don't feed the "$animal"s!\n"
    exit 3
  fi
fi

michel ~/test> cat feed.sh
#!/bin/bash
# This script acts upon the exit status given by penguin.sh

if [ "$#" != "2" ]; then
  echo -e "Usage of the feed script:\t$0 food-on-menu animal-name\n"
  exit 1
else

  export menu="$1"
  export animal="$2"

  echo -e "Feeding $menu to $animal...\n"

  feed="/nethome/anny/testdir/penguin.sh"

  $feed $menu $animal

result="$?"

  echo -e "Done feeding.\n"

case "$result" in

  1)
    echo -e "Guard: \"You'd better give'm a fish, less they get violent...\"\n"
    ;;
  2)
    echo -e "Guard: \"No wonder they flee our planet...\"\n"
    ;;
  3)
    echo -e "Guard: \"Buy the food that the Zoo provides at the entry, you ***\"\n"
    echo -e "Guard: \"You want to poison them, do you?\"\n"
    ;;
  *)
    echo -e "Guard: \"Don't forget the guide!\"\n"
    ;;
  esac

fi

echo "Leaving..."
echo -e "\a\a\aThanks for visiting the Zoo, hope to see you again soon!\n"

michel ~/test> feed.sh apple camel
Feeding apple to camel...

Will you read this sign?!  Don't feed the camels!

Done feeding.

Guard: "Buy the food that the Zoo provides at the entry, you ***"

Guard: "You want to poison them, do you?"

Leaving...
Thanks for visiting the Zoo, hope to see you again soon!

michel ~/test> feed.sh apple
Usage of the feed script:       ./feed.sh food-on-menu animal-name

مطالب بیشتر در مورد کاراکترهای گریز را می‌توانید در یخشی به نام«کاراکترهای گریز» پیدا کنید. جدول زیر خلاصه‌ای از رشته‌هایی که توسط فرمان echo شناخته می‌شوند، ارائه می‌کند:

جدول 8.1: رشته‌های Escape توسط فرمان echo

رشتهمقصود
\aهشدار( زنگ ).
\bبرگشت یک کاراکتر به عقب.
\cموقوف نمودن انتقال به سطر جدید.
\eEscape
\fرفتن به ابتدای سطر(کاراکتر FF).
\nسطر جدید.
\rسر سطر رفتن(کاراکتر CF).
\tافقی tab.
\vعمودی tab.
\\ممیز برعکس.
\0NNNکاراکتر ۸ بیتی که مقدار آن عدد اکتال NNN است(صفر تا سه رقم اکتال).
\NNNکاراکتر ۸ بیتی که مقدار آن عدد اکتال NNN است( یک با سه رقم تکتال ).
\xHHکاراکتر ۸ بیتی که مقدار آن هگزادسیمال است( یک یا دورقم هگزا ).

برای اطلاعات بیشتر در باره فرمان printf و روش مجاز قالب‌بندی خروجی آن،صفحه‌های info از Bash را ببینید. به خاطر بسپارید که ممکن است بین نگارش‌های مختلف Bash تفاوت‌هایی وجود داشته یاشد.

تمرین ها »
« گرفتن ورودی کاربر
ترجمه محمود پهلوانی