تجمع الدوال في Bash الأوامر ذات الصلة تحت اسم واحد. عند استدعاء هذا الاسم، يُنفَّذ الكتلة البرمجية بأكملها. يمكنك تمرير وسيطات لتخصيص السلوك، وإرجاع قيم لنقل النتائج. هذا يُبقي كودك منظماً وسهل الصيانة.
يهيمن Linux على بيئات الخوادم في جميع أنحاء العالم، لذا بات إتقان دوال Bash أمراً ضرورياً أكثر من أي وقت مضى. الدوال تحوّل السكريبتات الفوضوية إلى أتمتة منظمة وقابلة لإعادة الاستخدام.
يأخذك هذا الدليل من البنية الأساسية إلى حالات الاستخدام المتقدمة. ستتعلم كيفية تعريف الدوال، وتمرير المعاملات، والتعامل مع القيم المُرجَعة، مع عشرة أمثلة عملية يمكنك توظيفها مباشرةً في سكريبتاتك.
ملخص سريع
- دوال Bash هي كتل برمجية مُسمَّاة يمكنك إعادة استخدامها في أي مكان من سكريبتاتك
- عرّف الدوال باستخدام function_name() { commands; } البنية
- مرّر الوسيطات باستخدام $1, $2, $3 المعاملات الموضعية
- الدوال تُحسّن قابلية قراءة الكود وتنظيمه وسهولة صيانته
- استخدم return للخروج من الدوال وإرسال رموز الحالة (0 = نجاح، أي قيمة أخرى = فشل)
- يمكن مشاركة الدوال بين السكريبتات باستخدام source or export -f
- تشمل الأمثلة العملية: النسخ الاحتياطي للملفات، ومراقبة القرص، والتحقق من صحة المدخلات، والتحقق من حالة الخدمات
ما هو Bash Scripting؟

Bash scripting هو أسلوب لأتمتة المهام باستخدام Bash shell. يُعدّ الواجهة الافتراضية لسطر الأوامر في Linux، ولا يزال أداةً معيارية على macOS. سكريبت Bash هو برنامج مكتوب بلغة Bash scripting، يمكن تشغيله عبر الطرفية أو كملف سكريبت مستقل.
مع استخدام Linux على أجهزة سطح المكتب في تصاعد مستمر وهيمنة نظام التشغيل على بيئات الخوادم في جميع أنحاء العالم، باتت مهارات Bash scripting ذات قيمة حقيقية لمحترفي تقنية المعلومات. تتكامل اللغة بشكل جيد مع أدوات DevOps مثل Docker وKubernetes وخطوط CI/CD.
يتيح لك Bash scripting تنفيذ مهام تتراوح بين الأوامر البسيطة والأتمتة المعقدة وإدارة الأنظمة. يمكنك أتمتة المهام المتكررة، وكتابة سكريبتات الصيانة، وبناء خطوط النشر، وإدارة أنظمة البرمجيات، ومعالجة البيانات.
ما هي دالة Bash؟

دالة Bash هي مجموعة من الأوامر تُعرَّف إما داخل سكريبت Bash أو بشكل تفاعلي عند موجه الأوامر، وذلك حسب حالة الاستخدام. بمجرد تعريفها، يمكن استدعاء دالة Bash عدة مرات داخل السكريبت أو في سكريبتات أخرى، تمامًا كأي أمر shell عادي.
تتيح لك دوال Bash إنشاء كتل كود قابلة لإعادة الاستخدام، قادرة على تنفيذ عمليات معقدة وتنظيم الكود وتبسيط السكريبتات. يمكنك تمرير وسيطات إلى دالة Bash ثم استخدامها داخلها لتنفيذ العمليات. كما تُعيد دوال Bash قيمًا يمكنك توظيفها في أجزاء أخرى من السكريبت.
سنتناول عدة أساليب تطبيق محددة، منها simple_function للمنطق الأساسي، simple_inputs لمعالجة الوسيطات، وهياكل متقدمة مثل fibonnaci_recursion.
أساسيات دوال Bash ضرورية لكل مسؤول نظام أو مهندس DevOps يعمل مع الأتمتة. تتناول الأقسام التالية كل نوع من هذه الأنواع بالتفصيل.
لماذا نستخدم دوال Bash؟

بعد أن تعرفنا على مفهوم دوال Bash، لنستعرض أبرز مزاياها. يساعدك هذا القسم على فهم الحالات التي تُبرز فيها الدوال أكبر قيمة.
إعادة الاستخدام
حين تكتب دالة Bash، تحصل على أداة فعّالة يمكنك توظيفها أكثر من مرة داخل السكريبت أو حتى في سكريبتات أخرى.
هذا يجعل الكود أكثر كفاءة ويوفر الوقت بالتخلص من التكرار. كما يصبح صيانة الكود أيسر، إذ يكفيك تعديل الدالة في مكان واحد فقط.
سهولة القراءة
قد يصعب فهم السكريبتات المعقدة. تحل دوال Bash هذه المشكلة بتقسيم السكريبت إلى أجزاء أصغر وأسهل في الإدارة.
تؤدي كل دالة غرضًا محددًا، ويعكس اسمها الوصفي دورها بوضوح. هذا يجعل فهم الكود وصيانته أسهل لك وللآخرين.
النمطية
تُنظّم الدوال بنية الكود. يمكنك تقسيم المنطق إلى وحدات أصغر، مما يُبقي هيكل السكريبت واضحًا وسهل الإدارة.
وإن احتجت إلى إضافة ميزة جديدة، فيمكنك ذلك دون المساس ببقية السكريبت. وحين يحين وقت حذف وظيفة أو تعديلها، تبقى الأجزاء الأخرى من السكريبت سليمة دون تأثر.
معاملات دوال Bash
يمكنك تمرير وسيطات، أو معاملات، إلى دوالك. تتيح هذه الوسيطات لدوالك التكيّف وتنفيذ إجراءات مختلفة بناءً على المدخلات التي تتلقاها.
يفتح هذا إمكانيات واسعة مع جعل دوالك أكثر مرونة وقابلية للتكيّف. بدلاً من كتابة كود متشابه مرات عدة، تكتب دالة واحدة تتعامل مع مدخلات مختلفة.
كيف ومتى تستخدم دوال Bash؟

لنتناول الأمر بشكل أكثر تقنية ونبدأ بمثال قصير يوضح كيفية إنشاء دوال Bash. يمكن استخدام الصياغة التالية في البيئات المبنية على Unix. إن كنت تعمل على Windows، يمكنك تثبيت Linux Bash على Windows 10 لمتابعة هذه الأمثلة.
إنشاء دالة Bash
ابدأ باستخدام بنية الأمر التالية:
function_name () {
# الأوامر تذهب هنا
}
بمجرد إنشاء الدالة، يمكنك استخدامها في كودك في أي وقت. إليك مثالاً عملياً:
greet () {
echo "Hello, $1!"
}
استدعِ هذه الدالة بـ مرحبا بالعالم للحصول على المخرج "Hello, World!" ويمثّل $1 الوسيط الأول الممرَّر إلى الدالة.
إليك بعض الأمثلة العملية الإضافية التي يمكنك استخدامها في سكريبتاتك الخاصة:
# إنشاء نسخة احتياطية من أي ملف
backup_file () {
cp "$1" "$1.bak"
echo "Backup created: $1.bak"
}
# Check if a directory exists, create if it doesn't
ensure_dir () {
if [ ! -d "$1" ]; then
mkdir -p "$1"
echo "Created directory: $1"
fi
}
# تسجيل الرسائل مع الطوابع الزمنية
log_message () {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
تُعرِّف هذه الدوال المخصصة في Bash مرةً واحدة، ثم تستدعيها في أي مكان تحتاجها داخل السكريبت.
أساسيات صياغة الدوال
تعمل الدوال كسكريبتات مصغّرة داخل السكريبت الرئيسي، لكنها تشترك في ذاكرة الـ shell. ضع هذه السلوكيات الثلاث في اعتبارك عند كتابتها.
نطاق المتغيرات (محلي مقابل عام)
المتغيرات داخل الدوال عامة بشكل افتراضي. إذا عرّفت my_var="test" داخل دالة، فسيتجاوز أي قيمة موجودة مسبقاً للمتغير my_var في سكريبتك. استخدم دائماً local لحصر المتغيرات داخل الدالة وتجنّب الآثار الجانبية:
local my_var="value"
المعاملات الموضعية
تقرأ الدوال الوسائط باستخدام نفس متغيرات $1, $2، و $@ المستخدمة في السكريبتات. هذه المتغيرات محلية للدالة وتُعاد تهيئتها عند خروجها. وسائط السكريبت الأصلية غير متاحة داخل الدالة ما لم تمرّرها إليها صراحةً.
القيم المُعادة
دوال Bash لا تُعيد بيانات كما هو الحال في دوال Python أو Java. الأمر return يضبط فقط حالة الخروج (0-255) للإشارة إلى النجاح أو الفشل. لإعادة بيانات فعلية (كنص أو نتيجة حساب)، echo النتيجة والتقاطها عند استدعاء الدالة:
result=$(my_function)
أفضل ١٠ أمثلة عملية لدوال Bash
بعد أن تعرّفت على دوال Bash وكيفية إنشائها، إليك عشرة أمثلة عملية يمكنك إضافتها إلى سكريبتاتك. كل دالة تحل مشكلة شائعة وتوضح البنية الصحيحة للدوال، وطريقة تمرير المعاملات، وإرجاع القيم.
١. دالة النسخ الاحتياطي للملفات
تنشئ نسخة احتياطية مختومة بالتاريخ والوقت لأي ملف:
backup_file () {
local file="$1"
local backup="${file}.$(date +%Y%m%d_%H%M%S).bak"
if [ -f "$file" ]; then
cp "$file" "$backup"
echo "Backup created: $backup"
return 0
else
echo "Error: File not found"
return 1
fi
}
الاستخدام: backup_file /etc/nginx/nginx.conf
٢. أداة التحقق من المجلدات
تتحقق من وجود مجلد معين، وتنشئه تلقائيًا إن لم يكن موجودًا:
ensure_dir () {
local dir="$1"
if [ ! -d "$dir" ]; then
mkdir -p "$dir"
echo "Created: $dir"
fi
}
الاستخدام: ensure_dir /var/log/myapp
3. مسجّل الطوابع الزمنية
يضيف طوابع زمنية إلى رسائل السجل لأغراض تصحيح الأخطاء:
log_message () {
local level="$1"
local message="$2"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message"
}
الاستخدام: log_message "INFO" "Script started"
4. مراقب مساحة القرص
يفحص استخدام القرص ويُنبّه إذا تجاوز حدًا معيّنًا:
check_disk_space () {
local threshold="${1:-80}"
local usage=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [ "$usage" -gt "$threshold" ]; then
echo "Warning: Disk usage at ${usage}%"
return 1
fi
return 0
}
الاستخدام: check_disk_space 90
5. مدقّق المدخلات
يتحقق من أن مدخل المستخدم ليس فارغًا:
validate_input () {
local input="$1"
local name="$2"
if [ -z "$input" ]; then
echo "Error: $name cannot be empty"
return 1
fi
return 0
}
الاستخدام: validate_input "$username" "Username"
6. فاحص حالة الخدمة
يفحص ما إذا كانت الخدمة تعمل ويُبلّغ عن حالتها:
check_service () {
local service="$1"
if systemctl is-active --quiet "$service"; then
echo "$service يعمل"
return 0
else
echo "$service لا يعمل"
return 1
fi
}
الاستخدام: check_service nginx
٧. مستخرج امتداد الملف
يستخرج الامتداد من اسم الملف:
get_extension () {
local filename="$1"
echo "${filename##*.}"
}
الاستخدام: ext=$(get_extension "document.pdf")
٨. أداة تنظيف النصوص
تزيل المسافات الزائدة من بداية النص ونهايته:
trim_string () {
local str="$1"
str="${str#"${str%%[![:space:]]*}"}"
str="${str%"${str##*[![:space:]]}"}"
echo "$str"
}
الاستخدام: clean=$(trim_string " hello world ")
٩. أداة الأرشفة الآمنة للملفات
تنقل الملف إلى مجلد $HOME/.trash بدلاً من حذفه نهائياً. تُضاف لحظة زمنية إلى اسم الملف لتفادي الكتابة فوق النسخ الاحتياطية السابقة.
safe_remove() {
local file="$1"
local trash="$HOME/.trash"
# أضف طابعاً زمنياً لتجنب الكتابة فوق الملفات الموجودة
local new_name="$(basename "$file")_$(date +%s)"
mkdir -p "$trash"
if [ -e "$file" ]; then
mv "$file" "$trash/$new_name"
echo "تم الأرشفة: $file -> $trash/$new_name"
else
echo "خطأ: $file غير موجود"
return 1
fi
}
الاستخدام: safe_remove old_script.sh
١٠. مُقدِّم الحالة
يوضح آلية إرجاع القيم في دوال Bash للتعامل مع الأخطاء. تُشير قيمة الإرجاع في دالة Bash إلى النجاح (0) أو الفشل (قيمة غير صفرية):
process_data () {
local file="$1"
if [ ! -f "$file" ]; then
return 1
fi
# معالجة الملف
cat "$file" | wc -l
return 0
}
# التحقق من قيمة الإرجاع
process_data "data.txt"
if [ $? -eq 0 ]; then
echo "اكتملت المعالجة"
else
echo "فشلت المعالجة"
fi
الـ $? يحتفظ المتغير بحالة الخروج من آخر أمر أو استدعاء دالة.
| الدالة | الغرض | الميزة الرئيسية |
| backup_file | إنشاء نسخ احتياطية للملفات | تسمية مختومة بالوقت |
| ensure_dir | إدارة الدلائل | ينشئ تلقائياً عند الغياب |
| log_message | التسجيل | بادئة الطابع الزمني |
| check_disk_space | مراقبة النظام | تنبيهات العتبة |
| validate_input | التحقق من المدخلات | التحقق من النص الفارغ |
| check_service | مراقبة الخدمات | تكامل Systemd |
| get_extension | تحليل النصوص | توسيع المعاملات |
| trim_string | تنظيف النصوص | إزالة المسافات الزائدة |
| safe_remove | الحذف الآمن | دليل المهملات |
| process_data | معالجة الأخطاء | قيم الإرجاع |
تشغيل دوال Bash على VPS
تبلغ دوال Bash أقصى إمكاناتها عند تشغيلها في بيئة خادم مخصص. يمنحك Linux VPS وصولاً كاملاً بصلاحيات الجذر لتخصيص بيئة الصدفة، وإنشاء مكتبات دوال على مستوى النظام، وأتمتة مهام إدارة الخادم دون أي قيود.
مع VPS، يمكنك تخزين الدوال القابلة لإعادة الاستخدام في /etc/profile.d/ لجميع المستخدمين، وجدولة السكريبتات المبنية على الدوال عبر مهام cron، وبناء خطوط أتمتة للنشر والصيانة. نوفر خوادم في ١٢ موقعاً حول العالم بسرعات شبكة تصل إلى 40 Gbps وذاكرة DDR5، مما يعني تنفيذاً أسرع للسكريبتات ومعالجة أكثر سلاسة للبيانات.
هذا المستوى من التحكم يجعل VPS الخيار الأمثل لكل من يأخذ برمجة الصدفة وأتمتة الأنظمة على محمل الجد.
خلاصة
تُعدّ دوال Bash ركيزة أساسية لكتابة سكريبتات معيارية وقابلة لإعادة الاستخدام. إذ تتيح لك تجميع الأوامر ذات الصلة معاً وتغليف المنطق المعقد، مما يجعل الكود أسهل في القراءة والصيانة. سواء كنت تدير بنية سحابية، أو تؤتمت خطوط نشر، أو تتولى مهام إدارة النظام الروتينية، فإن الدوال تساعدك على إبقاء سكريبتاتك منظمة وفعّالة.
في هذا المقال، تناولنا أساسيات دوال Bash، من تعريفها واستدعائها، إلى عشرة أمثلة عملية وحالات استخدام شائعة، لمساعدتك على الانطلاق في مشاريع الأتمتة الخاصة بك.
بدمجها مع هياكل التحكم مثل جملة if في Bash، توفر الدوال اللبنات الأساسية لأتمتة قوية. باستخدام دوال Bash في سكريبتاتك، يمكنك كتابة كود أنظف وأكثر تنظيماً، يسهل فهمه وصيانته.