مقدمة إلى الدوال في Bash
ما هي الدوال؟
دوال الصدفة طريقة لتجميع أوامر من أجل تنفيذها لاحقًا باستخدام اسم واحد للمجموعة ككل أو روتين، ويجب أن يكون اسم الروتين فريدًا لا يتكرر في الصدفة أو الشيفرة النصية، وتُنفَّذ كل الأوامر التي تكوِّن الدالة مثل الأوامر العادية تمامًا.
تُنفَّذ قائمة الأوامر المرتبطة باسم دالة حين تُستدعى تلك الدالة كأمر بسيط، وتُنفَّذ الدالة داخل الصدفة التي صُرِّح عنها فيها، فلا تُفتح عملية جديدة لتفسير الأوامر. وستظهر الأوامر الخاصة المُضمَّنة قبل دوال الصدفة أثناء البحث عن الأوامر، والأوامر الخاصة المُضمَّنة هي:
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
}