محتويات الدورة

Bash / الأساسي: القواعد والقيم والتحكم / الدرس 4

إظهار الحالة وتدفق التحكم

استخدم نتائج الأوامر والشروط والاختيار والحلقات دون افتراض أن المخرجات أو set -e تحدد النجاح.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تفسير الحالات بعقود الأوامر.
  • اختيار شروط ونهايات حلقات واضحة.
  • حفظ حالة الفشل الأصلية أثناء التشخيص.

الحالة قناة نتائج مستقلة

يعيد الأمر حالة مستقلة عن خرجه وخطئه. يدل صفر اصطلاحاً على النجاح ويحتاج غيره تفسير العقد. قد يكون بحث دون تطابق فرعاً متوقعاً. تصف $? الأخير ويستبدلها التالي؛ فاقرأ فوراً أو اختبر الأمر بـ if. لا تستنتج النجاح من الصمت أو الرسالة أو بعض الخرج؛ فقد ينتج بيانات جزئية ثم يفشل.

اختبار العملية المعنية مباشرة

تنفذ if قائمة وتختار بالحالة ولا تشترط test. استخدم فرعي النجاح والفشل واحفظ الحالة أول else قبل الطباعة. يغير النفي الحالة المرئية؛ فـ if ! operation مفيد للفرع لكنه لا يحفظ الأصل في $?. البنية الصريحة أوضح من سلسلة يفشل وسطها أيضاً.

bash حفظ فشل مضبوط قبل الإبلاغ
operation() { return 7; }
if operation; then
  printf 'unexpected success\n'
else
  status=$?
  printf 'handled=%s\n' "$status"
fi
الناتج المتوقع
handled=7

تعيد الدالة المصطنعة سبعة ويحفظها else. تنجح الطباعة فينتهي المثال بنجاح بعد معالجة الفشل المتوقع.

استخدام case لمفردات إدخال محدودة

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

تحتاج الحلقة تقدماً وعقد إكمال

تكرر for قائمة وتختبر while وuntil الحالة. حدد ما يتغير والنهاية. قد يخفي break وcontinue تنظيفاً لازماً. يعيد الأمر الحسابي حالة من القيمة؛ فقد تكون ((count++)) غير صفرية إذا كانت القديمة صفراً. لا تعامل الحساب إسناداً محايداً. وضح الزيادة واختبر الصفر والواحد والفارغ والفشل المبكر.

bash جمع تكرار محدود واختيار
total=0
for value in 2 3 4; do
  total=$((total + value))
done
case $total in
  9) printf 'sum=%s\n' "$total" ;;
  *) printf 'unexpected total\n' ;;
esac
الناتج المتوقع
sum=9

تدخل أعداد مصطنعة معلنة فقط في الحساب. يتجنب الإسناد جعل حقيقة تعبير الزيادة سياسة خطأ الحلقة.

لا تستبدل الخيارات تصميم الفشل

لـ set -e استثناءات بالشروط والقوائم والأنابيب وسياق استدعاء الدالة. قد تختلف دالة شرط عن استدعائها العادي. لا تحدد القواعد المطلوب والاختياري والمتوقع فشله. عالج المهم صراحة وأعد حالة مفيدة. ندرس errexit والأنابيب تالياً؛ واجعل التدفق مفهوماً دون مفتاح عام خفي وافصل البيانات عن تفسير الفشل.

الأخطاء الشائعة وإصلاحها

قراءة $? بعد التشخيص

لماذا يحدث؟
استبدل التشخيص الحالة الأصلية.
كيف تصلحه؟
احفظ فوراً بمسار الفشل.
كيف تتجنب تكراره؟
راجع الحالة مع كل رسالة.

استخدام && و|| كبديل كامل للفرعين

لماذا يحدث؟
يحفز فشل فعل النجاح البديل.
كيف تصلحه؟
استخدم if مع فشل مستقل للفرعين.
كيف تتجنب تكراره؟
ارسم التدفق قبل الاختصار.

إعادة زيادة حالة فشل مفاجئة

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

اختبر فهمك

1. لماذا قد تنفذ a && b || c الأمر c رغم نجاح a؟

اعرض الحل المشروح

إذا فشل b صارت القائمة غير صفرية فيعمل c. يختلف ذلك عن else يعتمد a فقط. استخدم فرعاً صريحاً لفشل فعل النجاح المستقل.

2. أين يحفظ else حالة الأمر المطلوب؟

اعرض الحل المشروح

أول إجراء حساس قبل الطباعة أو التسجيل أو اختبار. احفظ status=$? واستخدمه للرسالة والإعادة. إذا نُفي الشرط فأعد التصميم لإتاحة الأصل.

أهم ما تعلمته

  • تفرع بالحالات الموثقة واحفظ الفشل فوراً.
  • فضل عقود فشل صريحة على الافتراضات العامة.

المراجع الرسمية