بسم الله الرحمن الرحيم

كما قلت في الدرس السابق أن هذا الدرس سيكون المدخل إلى
عالم البرمجة بالـ ShellScript و إن شاء الله سيستمر هذا الدرس حتى
الإحتراف بإذن لله...

الكثير يخطلط به الأمر بين bash و sh و الـ Terminal و الـ ShellScript

يُعتبر bash و sh هم المسؤلين عن الترجمه لملفات السكربت أو الأوامر
و الـ Terminal هي النافذه التي نتعامل من خلالها مع سطر الأوامر
أما الـ ShellScript فهي لغةالبرمجة بالـ Shell


هذا
الدرس مقسم إلى عدة أجزاء حتى يسهل إستيعابه و الأمثله الموجوده يستحسن
دائماً أن تكتبها بيدك حتى تكون عادة قراءة و كتابة الكود موجوده عندك بعد
الإنتهاء من سلسلة هذه الدروس , أي لا تعتمد على النسخ و اللصق ( Copy
& Paste )


نبدأ الدرس....

الجزء الأول


إنشاء ملفات
ShellScript

يمكنك إنشاء ملف ShellScript عن طريق أي ملف نصي عادي و بعد ذالك نُغير أسم الملف و نُضيف إلى أخر الملف sh. الذي يسمى Extantion
في المثال التالي قمنى بكتابة ShellScript صغير في ملف أسمة hello.sh وظيفتة هي طباعة رسالة ترحيب على الشاشة

كود:


# hello.sh
# This is my first shell script
printf “Hello! Bash is wonderfu.”
exit 0




نلاحظ أن أول سطر بدأ بعلامة # وهذه العلامة تختص بالتعليقات فقط أي أنه يمكنك كتابة أي شيئ بعد هذه العلامة و سيتم تجاهل الـBash لها , و ينتهي التعليق بنهاية السطر .

تكتب التعليقات لتكون غنية بالمعلومات اللازمة عن وظائف هذه الأوامر وليس وظائف أمر أمر , ولكي يسهل عملية الكشف عن الأخطاء فيما بعد وهذا لإحتواء وصف سريع عن وظائف ملف ShellScript معين فبالتالي يمكن إلغائه أو تعديله بسهوله أفضل من إختبار ملف ملف وخاصة في المشاريع التي تعتمد على عدد كبير من ملفات الـShellScript

الأمر exit و متبوع بالصفر 0 , معنها أنه يخبر الـ Bash أن الأوامر قد إنتهت بنجاح

يمكنك الأن تنفيذ السكربت و مشاهدة النتائج






$bash hello.sh







إذا لم يكن هناك أي أخطأ , سيظهر لك الرساله التاليه





Hello! Bash is wonderful.










إنشاء ShellScript بطريقة أحترافيه

نفترض أنك تريد الأن تنفيذ الأمر sync عندما تكون متأكد أنه لا يوجد أحد على النظام .
لتنفيذ هذا الأمر تابع هذا السكربت

كود:


USERS=`who | wc -l`
if [ $USERS -eq 0 ] ; then
sync
fi


هذا العمل سليم وثابت على الـBash , ولاكن راعي هذه الأسئله التاليه :


  • كيف سيعرف لينكس أن هذا Bash Script
  • إذا كان هناك عدد 0 من المستخدمين , فمن الذي سينفذ هذه الأوامر ؟
  • كيف سأعرف أن هذا السكربت ككل قد نجح النظام في تنفيذها أم لا ؟
  • ماذا سيحدث إذا تم مسح الأمر sync عن طريق الخطأ قبل تنفيذ هذا السكربت , أو إذا كان مدير النظام قد قام بتغير الصلاحيات في تنفيذ هذه الأمر ؟

لغة الـ ShellScript لغه مرنة جداً , فقط تحتاج أن تعمل عليها بشكل تفاعلي , ولاكن عندما تكتب السكربت يجب مراعات أن هذه المرونه قد تضعك أمام ثغرات أمنيه خطيره أو غير متوقعه تكون أنت المسؤل عنها .
لذالك أستعملها بأسلوب " محترف " , فيجب عليك تنفيذ و قراءة المزيد ولا تعتمد على النسخ و اللصق في التنفيذ .

دعونا الأن نتعمق أكثر في ملفات السكربت
فبُنية ملف السكربت تنقسم إلى خمسة أقسام



  1. The Header
  2. Global declarations
  3. Sanity checks
  4. The main script
  5. Cleanup

جميع الأقسام السابقة تلعب دور كبير جداً في تصميم السكربت , في الخطوات التاليه سترى كيف يمكنك تحسين نفسك في تتبع الأمثله عن طريق هذه الأقسام

The Header

في هذا القسم يحتوى على
نوع الملف السكربت هل هو sh أم bash ... إلخ
من الذي كتب هذا السكربت
ما هو رقم الإصدار
ما وظيفة السكربت أو شرح مبسط عن وظائفه
ما إذا كان هناك إختيارت له أم لا وهل هي إختيارات خارجيه أم داخليه
طريقة التعامل معه

يحتوي أول سطر في جزء الـ header على علامة مميزه وهي علامة ( # ) و هي العلامه الخاصة بالتعليقات كما ذكرت من قبل ولاكن في هذا السطر الأول في بداية ملف السكربت نكتب هذه العلامة ( # ) متبوعة بعلامة ( ! ) و بعدها نكتب مسار المترجم .

ما معنى مسار المترجم ولماذا نضيفة ؟
يقوم لينكس بقراءة هذه السطر قبل تنفيذه لباقي الملف لكي يحدد ما هو المترجم الذي سيتعامل معه هذا السكربت ...
في أغلاب التوزيعات تستخدم Bash و هنا تكون المعلومه قد حددنا ملامحها .. لماذا ؟
لأني سأكتب في أول سطر ملف السكربت مكان تواجد مترجم الـ Bash وهذا سهل جدا تحديده وهذا عن طريق تنفيذ هذا الأمر لكي نعرف مكان المترجم





$which bash
/bin/bash







يمكنني أن أكتب الناتج الأن في أول سطر وهذا لكي يكون السطر الأول بهذه الصوره





#!/bin/bash







ونفس الحال إذا كنت مستخدم للمترجم sh أو غيرهم


الصوره النهائية لمنطقة الـ header تكون بهذه الصوره


كود:

#!/bin/bash
#
# Flush disks if nobody is on the computer
#
# Seif Abaza
# CVS: $Header$


shopt -s -o nounset




وصف سريع لما هو مكتوب :
مسار المترجم الذي سنستعمله
وصف سريع لما يقوم به السكربت
من الذي كتب السكربت
خاصية CVS سأشرحها فيما بعد إن شاء الله

الأمر المكتوب هو أمر يكتشف بعض الأخطاء الإملائية الغير معروفه من قبل الإبلاغ للمتغيرات .

Global declarations

جميع الإعلانات والتي تنطبق على مجمل السكربت ينبغي أن تكون في مقدمة السكربت ، تحت الـ header. وهي منطقة الـ Global فوضعها جميعاً في مكان واحد تجعل من السهل على أي شخص أن يصل إليها أثناء قراءة السيناريو الخاص بالسكربت

مثال :

كود:


# Global Declarations
declare -rx SCRIPT=${0##*/} # SCRIPT is the name of this script
declare -rx who=”/usr/bin/who” # the who command - man 1 who
declare -rx sync=”/bin/sync” # the sync command - man 1 sync
declare -rx wc=”/usr/bin/wc” # the wc command - man 1 wc




Sanity Checks

القسم التالي وهو قسم الـ Sanity Checks يحمي السكربت من التغير الغير متوقع من الجهاز , في العادي عندما تنفذ الأوامر في سطر الأوامر , فيقوم الـ Bash بالبحث عن أماكن الأوامر داخل الجهاز , إذا لم يستطيع العثور عليها فربما من خطأ كتابي في الأمر وعندها سيقوم Bash بإخراج تقرير عن الخطأ , هذا السلوك الذي يتبعه Bash سلوك ممتاز للعمل معه بشكل تفاعلي لأنه بهاذا يوفر عليك الوقت و أي خطأ سيكون من السهل إصلاحة بالقليل من التعديلات

من الخواص الأخرى للسكربت أنه يعمل تحت إشراف أي شخص بعد التأكد من صلاحياته عليه وصلاحيات الأوامر التي ستنفذ داخل السكربت

الأمثال موجوده في المرفقات

إلى لقاء في الجزء الثاني من الدرس أساسيات برمجة الـ ShellScript  Wavesmile

أساسيات برمجة الـ ShellScript  Hatأتمنياتي لكم بالخير و الصحةأساسيات برمجة الـ ShellScript  Hat

المصدر مجتمع لينُكس العربي