- تتيح لك الدوال تغليف كتل من التعليمات البرمجية لتجنب التكرار وتحسين قابلية قراءة البرامج النصية.
- من الضروري إدارة نطاق المتغيرات باستخدام الكلمة المفتاحية المحلية لتجنب التعارضات مع البيئة العامة.
- يقتصر إرجاع القيم في Bash على حالة الخروج (0-255)، مما يتطلب استخدام echo أو المتغيرات لإرجاع البيانات المعقدة.
- يُسهّل استخدام أمر المصدر في عملية التجزئة إعادة استخدام الوظائف عبر ملفات النظام المتعددة.
عند البدء بكتابة سكربتات باش، من الطبيعي أن يبدو كل شيء بسيطًا في البداية، ولكن سرعان ما يصبح الكود معقدًا للغاية. إذا لاحظت تكرار نسخ ولصق نفس أجزاء الأوامر مرارًا وتكرارًا، فقد حان الوقت للانتقال إلى الدوال. ببساطة، الدالة أشبه بسكربت صغير داخل سكربت آخر ، يسمح لك بتسمية مجموعة من التعليمات لتتمكن من استدعائها وقتما تشاء.
لا يقتصر الأمر على توفير الوقت في الكتابة فحسب، بل يتعلق بتبني ممارسات احترافية. بتجنب تكرار التعليمات البرمجية، تقلل بشكل كبير من احتمالية ارتكاب الأخطاء، والأهم من ذلك، تجعل الصيانة أسهل بكثير. إذا احتجت إلى تغيير قاعدة عمل أو إصلاح خطأ برمجي، يكفيك القيام بذلك في مكان واحد فقط بدلاً من البحث في الملف بأكمله عن أماكن تكرارها.
كيفية تعريف الدوال في باش
لتنفيذ دالة، يوفر Bash عدة طرق للقيام بذلك، لذا يمكنك استخدام الطريقة التي تفضلها. الطريقة الأكثر شيوعًا والمفضلة هي كتابة اسم الدالة متبوعًا بأقواس. على سبيل المثال: mi_funcion() { comandos; }يوجد أيضًا تركيب نحوي أكثر وضوحًا يستخدم الكلمة المحجوزة وظيفة قبل الاسم، على الرغم من أنه من غير الشائع العثور عليه في النصوص الحديثة.
إذا كنت في عجلة من أمرك وتريد تحديد كل شيء في سطر واحد، يمكنك فعل ذلك، ولكن انتبه للمسافات! من الضروري ترك مسافة. مسافة بعد مفتاح الفتح وقبل العبارة الختامية، بالإضافة إلى فصل الأوامر الداخلية بفواصل منقوطة. على سبيل المثال: nombre() { echo "Hola"; echo "Mundo"; }إذا نسيت هذه التفاصيل، فسيصدر Bash تحذيراً ولن يبدأ البرنامج النصي.
من النقاط الأساسية التي لا يمكنك إغفالها أن تعريف دالة لا يعني تنفيذها تلقائيًا. لكي يعمل الكود الموجود بين الأقواس المعقوفة، عليك استدعاء الدالة بالاسم في متن البرنامج النصي. تذكر دائمًا تعريف الدالة قبل محاولة استخدامها ؛ فإذا استدعيتها قبل تعريفها، لن يتعرف النظام عليها وسيُظهر خطأً.
لعبة المتغيرات: النطاق العالمي والمحلي
هنا يقع الكثيرون في حيرة. في Bash، أي متغير تقوم بإنشائه يكون افتراضيًا عامًا . هذا يعني أنه إذا قمت بتعريف متغير داخل دالة، فسيظل موجودًا ويحتفظ بقيمته خارج تلك الدالة، مما قد يؤثر على أجزاء أخرى من البرنامج. قد يكون هذا مفيدًا، لكن في البرامج النصية الكبيرة، غالبًا ما يكون سببًا للمشاكل.
لتجنب هذه المفاجآت، توجد الكلمة المفتاحية `local` . بتعريف متغير كمتغير `local` داخل دالة، تضمن أنه مرئي وقابل للتعديل فقط داخل كتلة التعليمات البرمجية تلك. إذا كان لديك متغير عام ومتغير محلي بنفس الاسم، فسيكون للمتغير المحلي الأولوية داخل الدالة، ولكن بمجرد انتهاء الدالة، سيعود المتغير العام إلى قيمته الأصلية غير المعدلة.
تمرير الوسائط إلى الدوال
لا يشترط أن تكون الدوال ثابتة؛ إذ يمكنها استقبال بيانات لمعالجة معلومات مختلفة في كل مرة يتم استدعاؤها. لتمرير الوسائط، اكتبها ببساطة بعد اسم الدالة، مفصولة بمسافات. داخل الدالة، ستتمكن من الوصول إليها باستخدام المتغيرات الموضعية كما $1, $2، الخ.
من المهم التمييز بين أن هذه المتغيرات مستقلة عن الوسائط التي يستقبلها البرنامج النصي الرئيسي. بينما $0 يشير دائمًا إلى اسم البرنامج النصيالمتغيرات من $1 فوق $9 داخل الدالة، تشير هذه تحديدًا إلى المعاملات التي تم تمريرها إلى تلك الدالة. بالإضافة إلى ذلك، لدينا أدوات مفيدة مثل $# لمعرفة عدد الحجج التي تم تلقيها أو $@ للاطلاع على القائمة الكاملة للمعلمات.
معضلة إرجاع القيم
على عكس لغات مثل بايثون أو جافا، لا تُرجع دوال باش قيمًا بالمعنى التقليدي. ما تُرجعه العبارة return هو حالة الخروج، عدد صحيح بين 0 و 255. وبحسب الاصطلاح، يشير الرقم 0 إلى أن كل شيء سار بسلاسة (نجاح) وأي رقم آخر يمثل رمز خطأ.
إذا كنت بحاجة إلى استرجاع نتيجة عملية حسابية أو نص معين، فلديك خياران رئيسيان. الأول هو استخدام متغير عام لتخزين النتيجة، على الرغم من أن هذه ليست الطريقة الأمثل. أما الخيار الأكثر أناقة فهو استخدام المخرجات القياسية باستخدام الأمر echo o printf والتقاط تلك النتيجة من الخارج باستخدام استبدال الأوامر: resultado=$(mi_funcion)وبهذه الطريقة، يتم تخزين القيمة التي تطبعها الدالة مباشرة في المتغير.
إعادة الاستخدام المتقدمة والتكرار
من أبرز مزايا Bash القدرة على تنظيم الدوال في ملفات منفصلة. إذا كان لديك مجموعة من الأدوات التي تستخدمها في العديد من البرامج النصية، يمكنك حفظها في ملف (على سبيل المثال، utils.shثم قم بتحميلها في أي برنامج نصي آخر باستخدام الأمر مصدر (أو النقطة) .هذا يحول وظائفك إلى أوامر متاحة في العملية الحالية، مما يحسن وقت التطوير.
للمبرمجين الأكثر ميلاً للمغامرة، توجد الدوال التكرارية ، وهي الدوال التي تستدعي نفسها. تُعدّ هذه الدوال مثالية لحلّ المسائل التي يمكن تقسيمها إلى مهام فرعية متطابقة، مثل حساب المضروب. يكمن السرّ هنا في تحديد حالة أساسية دائمًا ؛ وإلا، ستستدعي الدالة نفسها بلا نهاية حتى ينفد النظام من الموارد ويتوقف البرنامج عن العمل.
يُمكّنك إتقان استخدام الدوال من تحويل البرامج النصية الخطية والمملة إلى أدوات معيارية سهلة القراءة والصيانة. بدءًا من التصريح الصحيح والإدارة الذكية لنطاق المتغيرات، وصولًا إلى استخدام الاستدعاء الذاتي واستيراد المكتبات الخارجية عبر المصدر، تجعل هذه الإمكانيات من Bash shell بيئة أتمتة قوية للغاية لأي مسؤول نظام أو مطور برامج.