ديف أوبس

بنى التحكم في سكربتات الصدفة

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

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

1. الجمل الشرطية المتقدمة في سكربتات الصدفة

جملة if المتعددة الشروط

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

bash
#!/bin/bash # قراءة قيمة من المستخدم echo "أدخل الرقم:" read number # التحقق من العدد المدخل if [ $number -lt 0 ]; then echo "العدد سالب" elif [ $number -eq 0 ]; then echo "العدد صفر" else echo "العدد موجب" fi

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

جملة case المتقدمة

من أجل تحسين القراءة والتنسيق عند التعامل مع عدة قيم محتملة، يمكن استخدام جملة case. تعد جملة case طريقة أكثر تنظيمًا للتعامل مع القيم المتعددة مقارنة باستخدام جملة if المتعددة الشروط.

bash
#!/bin/bash echo "أدخل حرفًا:" read char case $char in [a-z] ) echo "الحرف هو من الألف إلى الياء" ;; [A-Z] ) echo "الحرف هو من A إلى Z" ;; [0-9] ) echo "الحرف هو رقم" ;; * ) echo "حرف غير معروف" ;; esac

هنا، يتم التحقق من الحرف المدخل وإذا كان حرفًا صغيرًا من [a-z] أو حرفًا كبيرًا من [A-Z] أو رقمًا من [0-9]، يتم إرجاع رسالة معينة بناءً على كل حالة.

2. الحلقات التكرارية المتقدمة

حلقة for مع المصفوفات

تُعتبر حلقات for من أكثر البنى التي يتم استخدامها في سكربتات الصدفة، حيث تسمح بتكرار عملية معينة لعدد معين من المرات. يمكن استخدام for مع المصفوفات لتكرار مجموعة من العناصر.

bash
#!/bin/bash # مصفوفة تحتوي على أسماء المستخدمين users=("user1" "user2" "user3" "user4") # طباعة كل اسم من المصفوفة for user in "${users[@]}"; do echo "مرحبا $user" done

في هذا المثال، يتم تكرار الأسماء الموجودة في المصفوفة وطباعة رسالة ترحيب لكل اسم.

حلقة while مع الشروط المعقدة

الحلقات التي تعتمد على الشروط مثل while وuntil توفر تحكمًا دقيقًا في تدفق السكربت بناءً على حالات معينة. في هذه الحلقات، يتم تكرار الأوامر طالما أن الشرط صحيح.

bash
#!/bin/bash # تكرار عملية حتى يصبح العدد أكبر من 10 count=1 while [ $count -le 10 ]; do echo "العدد هو: $count" ((count++)) done

يتم في هذا المثال تكرار طباعة الأعداد من 1 إلى 10 باستخدام حلقة while. الشرط هنا هو أن العدد يجب أن يكون أقل من أو يساوي 10.

حلقة until

تعد حلقة until مشابهة لحلقة while، إلا أنها تعمل بشكل معاكس. أي أنها تستمر في التكرار حتى يصبح الشرط صحيحًا.

bash
#!/bin/bash # استخدام حلقة until لتكرار حتى يكون العدد أكبر من 10 count=1 until [ $count -gt 10 ]; do echo "العدد هو: $count" ((count++)) done

هنا، سيتم تكرار الأوامر حتى يصبح العدد أكبر من 10.

3. التحكم في التدفق باستخدام break و continue

استخدام break

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

bash
#!/bin/bash # العثور على أول رقم فردي for number in {1..10}; do if [ $((number % 2)) -eq 1 ]; then echo "أول رقم فردي هو: $number" break fi done

في هذا المثال، يتم البحث عن أول رقم فردي في السلسلة، وعند العثور عليه، يتم استخدام break للخروج من الحلقة.

استخدام continue

على عكس break التي توقف الحلقة بالكامل، يتم استخدام continue لتخطي التكرار الحالي من الحلقة والانتقال مباشرة إلى التكرار التالي.

bash
#!/bin/bash # طباعة الأعداد الزوجية فقط for number in {1..10}; do if [ $((number % 2)) -ne 0 ]; then continue fi echo "العدد الزوجي هو: $number" done

هنا، يتم تخطي الأعداد الفردية باستخدام continue وطباعة الأعداد الزوجية فقط.

4. التحكم في التدفق باستخدام الجمل المنطقية

استخدام الجمل المنطقية

يمكن دمج العبارات الشرطية باستخدام المنطق مثل && و ||، مما يسهل تنفيذ الأوامر بناءً على نتائج أخرى.

bash
#!/bin/bash # تنفيذ أمرين إذا كان الأول صحيحًا [ -f "/etc/passwd" ] && echo "الملف موجود" || echo "الملف غير موجود"

في هذا المثال، يتم التحقق من وجود الملف /etc/passwd باستخدام جملة if مختصرة، وإذا كان موجودًا يتم طباعة “الملف موجود”، وإذا لم يكن موجودًا يتم طباعة “الملف غير موجود”.

5. المصفوفات والدوال في سكربتات الصدفة

استخدام المصفوفات في بنى التحكم

تُستخدم المصفوفات في سكربتات الصدفة لتخزين مجموعات من البيانات مثل الأسماء أو القيم، ويمكن دمجها مع بنى التحكم لاتخاذ قرارات ديناميكية بناءً على العناصر المخزنة في المصفوفة.

bash
#!/bin/bash # مصفوفة من الملفات files=("file1.txt" "file2.txt" "file3.txt") for file in "${files[@]}"; do if [ -e "$file" ]; then echo "الملف $file موجود." else echo "الملف $file غير موجود." fi done

استخدام الدوال لتنظيم السكربت

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

bash
#!/bin/bash # دالة للتحقق من وجود ملف check_file() { if [ -e "$1" ]; then echo "الملف $1 موجود." else echo "الملف $1 غير موجود." fi } # استخدام الدالة check_file "/etc/passwd" check_file "/nonexistentfile"

في هذا المثال، تم إنشاء دالة check_file للتحقق من وجود الملف، واستخدامها مع ملفات متعددة للتحقق من وجودها أو عدمه.

6. الخلاصة

يُعتبر التحكم في تدفق البرنامج من العناصر الأساسية التي تجعل سكربتات الصدفة أكثر فاعلية ومرونة. باستخدام الجمل الشرطية المتقدمة مثل if وcase، وحلقات التكرار المختلفة مثل for وwhile وuntil، يمكن كتابة سكربتات تتعامل مع سيناريوهات معقدة ومتنوعة. كما أن استخدام الأدوات مثل break وcontinue يوفر مزيدًا من التحكم في كيفية تكرار الأوامر وتنظيمها داخل الحلقات.