Bash/introduction to functions

من موسوعة حسوب

ما هي الدوال؟

دوال الصدفة طريقة لتجميع أوامر من أجل تنفيذها لاحقًا باستخدام اسم واحد للمجموعة ككل أو روتين، ويجب أن يكون اسم الروتين فريدًا لا يتكرر في الصدفة أو الشيفرة النصية، وتُنفَّذ كل الأوامر التي تكوِّن الدالة مثل الأوامر العادية تمامًا.

تُنفَّذ قائمة الأوامر المرتبطة باسم دالة حين تُستدعى تلك الدالة كأمر بسيط، وتُنفَّذ الدالة داخل الصدفة التي صُرِّح عنها فيها، فلا تُفتح عملية جديدة لتفسير الأوامر. وستظهر الأوامر الخاصة المُضمَّنة قبل دوال الصدفة أثناء البحث عن الأوامر، والأوامر الخاصة المُضمَّنة هي:

break, :, ., continue, eval, exec, exit, export, readonly, return, set, shift, trap, unset.

القواعد التركيبية للدوال Functions Syntax

تستخدم الدوال إحدى هاتين القاعدتين:

function FUNCTION { COMMANDS; }

أو

FUNCTION () { COMMANDS; }

تلك القاعدتين تحددان دالة للصدفة اسمها FUNCTION، ولا يشترط استخدام أمر function لكن إن لم تستخدمه فستحتاج إلى القوسين () كما ترى في القاعدة الثانية.

أخطاء شائعة

يجب أن تفصل مسافة بين القوسين المعقوفين { } ومحتوى الدالة بينهما، وإلا سيُفسَّر محتوى الدالة خطأً، وكذلك يجب أن ينتهي محتوى الدالة بفاصلة منقوطة ; أو سطر جديد.

المعامِلات الموضعية في الدوال

تشبه الدوالُ شيفراتٍ مصغَّرة، إذ يمكنها قبول معامِلات (parameters) واستخدام متغيرات لا يمكن استخدامها خارج الدوال عبر أمر local، كما يمكنها إعادة قِيَم إلى الصدفة التي استدعتها.

ولدى الدوال نظام لتفسير المعامِلات الموضعية رغم أن المعامِلات الموضعية التي تُمرَّر إلى الدالة ليست كتلك التي تُمرَّر إلى أمر أو شيفرة نصية. وحين تُنفَّذ الدالة فإن وسائطها تصير معامِلات موضعية أثناء تنفيذها، ويُحدَّث المعامِل الخاص # الذي يتوسع إلى عدد المعامِلات الموضعية ليعكس التغير الحادث.

لا يتغير المعامل الموضعي 0، ويُضبط متغير FUNCNAME إلى اسم الدالة أثناء تنفيذها. وإن نُفِّذَ أمر return في دالة فإن الدالة تُتم تنفيذها ثم يُنفَّذ الأمر الذي بعد استدعاء الدالة. وتعود قيَم المعاملات الموضعية والمعامل الخاص # بعد تمام تنفيذ دالة إلى القيم التي كانت عليها قبل تنفيذ الدالة، وإن تم تمرير وسيط عددي إلى return فإن تلك الحالة يتم إرجاعها. إليك مثالًا بسيطًا:

[ahmad@ahmadpc ~/test] cat showparams.sh
#!/bin/bash                                                                          

echo "This script demonstrates function arguments."
echo                                                                            

echo "Positional parameter 1 for the script is $1."
echo                                                                            

test ()
{
echo "Positional parameter 1 in the function is $1."
RETURN_VALUE=$?
echo "The exit code of this function is $RETURN_VALUE."
}                                                                        

test other_param

[ahmad@ahmadpc ~/test] ./showparams.sh parameter1
This script demonstrates function arguments.

Positional parameter 1 for the script is parameter1.

Positional parameter 1 in the function is other_param.
The exit code of this function is 0.

[ahmad@ahmadpc ~/test]

لاحظ أن قيمة الإعادة أو رمز الخروج للدالة يُخزَّن غالبًا في متغير من أجل فحصه (probed) لاحقًا، وتستخدم شيفرات init في نظامك تقنية فحص متغير RETVAL في اختبار شرطي كهذا:

if [ $RETVAL -eq 0 ]; then
        <start the daemon>

أو كما في المثال التالي من شيفرة ‎/etc/init.d/amd حيث تُستخدم مزايا تهيئة bash:

[ $RETVAL = 0 ] && touch /var/lock/subsys/amd

لا تُنفَّذ الأوامر التي بعد && إلا في حالة نجاح الاختبار، وهي طريقة أقصر للتعبير عن if/then/if. ويُستخدم رمز الإعادة للدالة كرمز خروج من الشيفرة كلها، وسترى شيفرات init كثيرة تنتهي بشيء مثل exit $RETVAL.

عرض الدوال Displaying Functions

يمكن عرض كل الدوال المعروفة للصدفة الحالية باستخدام أمر set بدون خيارات، إذ تبقى الدوال بعد استخدامها ما لم يُستخدم أمر unset لإزالتها، كما يعرض أمر which الدوال أيضًا:

[ahmad@ahmadpc ~] which zless
zless is a function
zless ()
{
   zcat "$@" | "$PAGER"
}
[ahmad@ahmadpc ~] echo $PAGER
less

هذا مثال عن الدالة التي تُهيأ في ملفات إعدادات موارد الصدفة الخاصة بالمستخدم، وبشكل عام فإن الدوال أكثر مرونة من الأوامر البديلة وتوفِّر طريقة بسيطة وسهلة لتهيئة بيئة المستخدم. إليك واحدة لمستخدمي DOS:

dir ()
{
   ls -F --color=auto -lF --color=always "$@" | less -r
}

انظر أيضًا

البُنى الشرطية في Bash

بيئة Bash

مصادر

مشروع توثيق لينكس، صفحة مقدمة إلى الدوال.