ديف أوبس

بنى التحكم في سكربت الشيل

كيف تستخدم بنى التحكم (Flow Control) في سكربتات الصدفة (Shell Scripts) – الجزء الأول

تُعد سكربتات الصدفة (Shell Scripts) من الأدوات الجوهرية في إدارة أنظمة التشغيل الشبيهة بيونكس مثل Linux وUnix. ومن أهم مفاتيح كتابة سكربتات فعالة وقوية القدرة على التحكم في تدفق التنفيذ داخل هذه السكربتات. تتجلى أهمية بنى التحكم (Flow Control) في إمكانية توجيه تنفيذ الأوامر وفق شروط معينة، أو تكرار تنفيذ أجزاء من السكربت، أو التعامل مع مدخلات ومخرجات متعددة بطريقة منطقية ومدروسة. يمكن تشبيه بنى التحكم بهيكل عظمي يمنح السكربت صلابته ومرونته في آن واحد.

يتناول هذا المقال الجزء الأول من استخدام بنى التحكم في سكربتات الصدفة، مع تقديم شرح موسع للبُنى الأساسية مثل: التفرع الشرطي (if/then/else)، جملة case، الحلقات (loops)، وجمل التحكم break وcontinue، مدعوماً بالأمثلة والشروحات الفنية الضرورية.


1. التفرع الشرطي if/then/else

تُستخدم البنية الشرطية if في سكربتات الصدفة لاتخاذ قرار مبني على تحقق شرط معين. يعتبر هذا النوع من أبسط وأهم الأدوات لتوجيه سير تنفيذ السكربت.

الصيغة الأساسية:

bash
if [ شرط ]; then أوامر عند تحقق الشرط else أوامر عند عدم تحقق الشرط fi

مثال تطبيقي:

bash
#!/bin/bash echo "أدخل رقم:" read num if [ $num -gt 0 ]; then echo "الرقم موجب" else echo "الرقم غير موجب" fi

في هذا المثال يتم فحص ما إذا كان الرقم المدخل أكبر من الصفر، وفي حال تحقق الشرط تتم طباعة “الرقم موجب”، وإلا تطبع “الرقم غير موجب”.

ملاحظة فنية:

  • يجب استخدام فراغات حول الأقواس المربعة [ و].

  • عند التعامل مع أرقام، يتم استخدام المعاملات مثل -eq، -ne، -gt، -lt، -ge، و-le.

  • عند التعامل مع نصوص، يتم استخدام =, !=, -z, -n.


2. التفرع المتعدد if/elif/else

عندما يتطلب البرنامج اختبار عدة حالات مختلفة يمكن استخدام البنية التالية:

bash
if [ شرط1 ]; then أوامر1 elif [ شرط2 ]; then أوامر2 else أوامر افتراضية fi

مثال تطبيقي:

bash
#!/bin/bash echo "أدخل درجة الطالب:" read grade if [ $grade -ge 90 ]; then echo "التقدير: ممتاز" elif [ $grade -ge 75 ]; then echo "التقدير: جيد جداً" elif [ $grade -ge 60 ]; then echo "التقدير: جيد" else echo "التقدير: راسب" fi

3. استخدام جملة case

تُستخدم جملة case كبديل أنيق للبنية الشرطية عندما تكون هناك حاجة لاختبار قيمة واحدة مقابل عدة قيم محتملة.

الصيغة العامة:

bash
case قيمة in نمط1) أوامر ;; نمط2) أوامر ;; *) أوامر افتراضية ;; esac

مثال تطبيقي:

bash
#!/bin/bash echo "أدخل اسم اليوم:" read day case $day in "السبت"|"الأحد") echo "بداية الأسبوع" ;; "الخميس"|"الجمعة") echo "نهاية الأسبوع" ;; *) echo "يوم في وسط الأسبوع" ;; esac

يُفيد هذا النوع من التفرعات في تصنيف القيم ضمن مجموعات بطريقة نظيفة ومنظمة.


4. الحلقات التكرارية (Loops)

الحلقات تُستخدم لتنفيذ مجموعة من الأوامر بشكل متكرر، سواءً لعدد معين من المرات أو طالما تحقق شرط معين.

4.1 الحلقة for

تُستخدم عندما يكون هناك عدد معروف من التكرارات.

الصيغة الأساسية:

bash
for var in قائمة do أوامر done

مثال:

bash
#!/bin/bash for name in "علي" "سارة" "فهد" do echo "مرحباً $name" done

4.2 الحلقة while

تُستخدم عندما يكون التكرار مشروطاً بتحقق شرط معين.

الصيغة:

bash
while [ شرط ] do أوامر done

مثال:

bash
#!/bin/bash count=1 while [ $count -le 5 ] do echo "العد: $count" ((count++)) done

4.3 الحلقة until

تعمل بشكل معاكس لـ while، حيث تستمر الحلقة حتى يتحقق الشرط.

الصيغة:

bash
until [ شرط ] do أوامر done

مثال:

bash
#!/bin/bash num=1 until [ $num -gt 5 ] do echo "الرقم هو $num" ((num++)) done

5. التحكم في الحلقات: break و continue

5.1 جملة break

تُستخدم لإنهاء الحلقة فوراً عند تحقق شرط معين.

مثال:

bash
for i in {1..10} do if [ $i -eq 5 ]; then break fi echo $i done

5.2 جملة continue

تُستخدم لتخطي التكرار الحالي من الحلقة والانتقال إلى التكرار التالي.

مثال:

bash
for i in {1..5} do if [ $i -eq 3 ]; then continue fi echo $i done

6. مقارنة بين أنواع الحلقات

النوع أفضل استخدام يُنهي بالشرط يُبدأ بتكرار محدد
for تكرار محدد العناصر لا نعم
while شرط غير ثابت نعم لا
until شرط غير ثابت معكوس نعم لا

7. الاعتبارات الأمنية والمهنية

عند استخدام بنى التحكم، من المهم مراعاة النقاط التالية:

  • التحقق من المدخلات: يجب دوماً التحقق من القيم التي يدخلها المستخدم لتفادي تنفيذ أوامر ضارة.

  • الاستخدام الآمن للمتغيرات: يفضل إحاطة المتغيرات بعلامات اقتباس " " لتفادي تأثير المسافات البيضاء أو القيم الفارغة.

  • عدم الاعتماد على الملفات الخارجية بشكل مباشر ما لم يتم التحقق من وجودها وصلاحيات الوصول إليها.

  • تحديد نطاق المتغيرات داخل الحلقات لتفادي تأثيرها على أجزاء أخرى من السكربت.


خاتمة تقنية للجزء الأول

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

سيتم في الجزء الثاني التعمق في مفاهيم أكثر تقدماً مثل التحكم في التدفق باستخدام الدوال، إدارة الأخطاء، جمل select التفاعلية، وآليات المعالجة المتوازية باستخدام & وwait، وذلك لتوسيع الأفق البرمجي والتحكم الكامل في تنفيذ السكربتات.


المصادر والمراجع:

  • William E. Shotts Jr., The Linux Command Line, No Starch Press

  • GNU Bash Manual