عرض رسائل المستخدم في Bash

من موسوعة حسوب

برامج تفاعلية أم غير تفاعلية؟

تعمل بعض برامج الصدفة (shell scripts) دون أي تدخل من المستخدم ويطلق عليها برامج غير تفاعلية، ومن بعض مزايا تلك البرامج أنها تعمل بشكل متوقع في كل مرة، ويمكنها العمل في الخلفية أيضًا. لكن باقي برامج الصدفة تحتاج إدخالًا من المستخدم أو تحتاج أن تطبع رسائل للمستخدم أثناء عملها، ولذلك النوع من البرامج مزايا كذلك، إذ يمكن بناء برامج أكثر مرونة، ويمكن للمستخدم تخصيص البرنامج أثناء تشغيله أو جعله يتصرف بأشكال مختلفة، كما يمكن للبرنامج أن يرسل تقاريرًا أثناء تشغيله.

لا تتكاسل عن كتابة التعليقات في برامجك أثناء كتابة برامج تفاعلية، فالبرامج التي تطبع رسائل مناسبة تكون صديقة للمستخدم أكثر ويسهل تصحيح أخطائها (Debugging)، وقد يكون برنامجك ممتازًا لكن رغم ذلك تجد نفسك تتلقى اتصالات طلبًا للدعم الفني إن لم يكن البرنامج يخبر المستخدم بما ينفِّذُه، لذا تأكد من وضع رسائل تخبر المستخدم على سبيل المثال أن ينتظر ظهور الخَرْج لأن البرنامج يجري حسابات الآن. كذلك حاول -كلما أمكن- أن تقدم تقديرًا لطول العملية الجارية أو المدة التي يجب أن ينتظرها المستخدم، فإن كان الانتظار سيطول فربما يجب أن تضع مؤشرًا لتقدم العملية في خرج برنامجك.

كذلك يُفضَّل في حالة طلب إدخالٍ من المستخدم أن تعطي معلومات واضحة وشافية عن البيانات التي تود من المستخدم أن يدخلها، وينطبق هذا على فحص الوسائط (arguments) ورسائل الاستخدام (Usage Messages) المصاحِبة لها أيضًا.

والأوامر التي تستخدمها لتطبع تعليقاتك للمستخدم هي echo و printf، وسنناقش بعض الأمثلة فيما يلي رغم أنك قد تكون معتادًا على استخدام echo بالفعل.

استخدام أمر echo

يُخرج أمر echo وسائطه (arguments) مفصولين بمسافات وينتهون بمحرف السطر الجديد، وتكون حالة الإعادة صفرًا على الدوام. كذلك يأخذ أمر echo بضعة خيارات:

e-: يفسر المحارف المهرَّبة بمحرف الشرطة المائلة (انظر محارف الهروب في فصل اقتباس المحارف).

n-: يوقف عمل السطر الجديد في نهاية الأمر (trailing new line).

إليك مثالًا عن إضافة التعليقات سنستخدم فيه مثاليْن من قسم فحص وسائط سطر الأوامر، فصل الاستخدامات المتقدمة لعبارة if الشرطية:

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

# (Tux) هذا البرنامج يسمح لك بتقديم أطعمة إلى البطريق
# لن يكون البطريق سعيدًا إلا حين يُعطى سمكة، وقد أضفينا قليلًا من المرح بإضافة بعض الحيوانات الأخرى

if [ "$menu" == "fish" ]; then
  if [ "$animal" == "penguin" ]; then
    echo -e "Hmmmmmm fish... Tux is 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 doesn'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
# 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!

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

انظر محارف الهروب للمزيد من الشرح المفصل عنها.

يبين الجدول التالي التسلسلات التي يتعرف عليها أمر echo:

جدول 8-1: التسلسلات التي يستخدمها أمر echo:

التسلسل المعنى
a\ إنذار (جرس).
b\ مسافة للخلف (Backspace)، يمسح المحرف الذي قبله.
c\ يوقف السطر الجديد في نهاية الأمر (trailing newline).
e\ محرف الهروب Escape.
f\ الانتقال إلى الصفحة الجديدة (Form Feed)، ينقل المؤشر صفحة كاملة للأمام، أو ينقله إلى بداية الصفحة التالية.
n\ سطر جديد.
r\ محرف العودة إلى بداية السطر (Carriage Return)، يماثل الضغط على مفتاح Enter.
t\ مسافة جدولة أفقية (يماثل الضغط على زر tab).
v\ مسافة جدولة رأسية (يماثل الضغط على زر tab).
\\ شرطة مائلة خلفية، تظهر كشرطة مائلة بدل أن تفسرها الصدفة.
0NNN\ محرف بايت -8 بت- قيمته هي القيمة الثُمانية NNN (صفرًا إلى ثلاثة أرقام ثُمانيَّة).
NNN\ محرف بايت قيمته هي القيمة الثُمانيَّة NNN (رقم إلى ثلاثة أرقام ثُمانيَّة).
xHH\ محرف بايت قيمته هي القيمة السداسية العشرية HH (رقم سداسي عشري أو رقمين).

انظر صفحات دليل info للمزيد عن أمر printf والأسلوب الذي يسمح لك به بصياغة المخرجات، انتبه أنه قد تكون هناك فروقات بين الإصدارات المختلفة من Bash.

انظر أيضًا

مصادر