Functions في Bash Scripting: تنظيم السكربتات باحتراف
كلما كبر سكربت Bash، يصبح تنظيمه أصعب بدون Functions. الدوال هي الطريقة الأساسية لجعل السكربت واضحًا وقابلًا لإعادة الاستخدام.
في هذا الدرس ستتعلم تعريف الدوال واستدعاءها وتمرير القيم بينها بشكل عملي.
لماذا نستخدم Functions في Bash؟
- تقليل تكرار نفس الأوامر
- تنظيم السكربت إلى وحدات واضحة
- تسهيل الصيانة والتطوير لاحقًا
تعريف دالة بسيطة في Bash
#!/bin/bash
say_hello() {
echo "Hello from function"
}
say_hello
يمكنك تعريف الدالة قبل استدعائها داخل نفس السكربت.
تمرير Arguments إلى Functions
#!/bin/bash
greet_user() {
echo "Hello $1"
}
greet_user "Ali"
greet_user "Sara"
داخل الدالة، $1 هو أول argument و$2 ثاني argument.
استخدام المتغيرات المحلية local
#!/bin/bash
set_name() {
local NAME="Linux User"
echo "Inside function: $NAME"
}
NAME="Global Name"
set_name
echo "Outside function: $NAME"
local يمنع تعارض المتغيرات بين الدوال وباقي السكربت.
قيمة الإرجاع: return vs echo
إرجاع حالة نجاح/فشل عبر return:
check_file() {
if [ -f "$1" ]; then
return 0
else
return 1
fi
}
check_file "/etc/passwd"
echo "Exit code: $?"
إرجاع قيمة نصية عبر echo:
get_date() {
echo "$(date +%F)"
}
TODAY=$(get_date)
echo "Today is $TODAY"
دالة مع منطق شرطي وتكرار
process_users() {
for USER in "$@"; do
if [ -n "$USER" ]; then
echo "Processing: $USER"
fi
done
}
process_users ali sara omar
"$@" يمرر كل arguments للدالة بشكل صحيح.
تنظيم سكربت حقيقي باستخدام Functions
#!/bin/bash
log_info() {
echo "[INFO] $1"
}
backup() {
log_info "Start backup..."
tar -czf /tmp/backup.tar.gz /etc 2>/dev/null
log_info "Backup done."
}
main() {
log_info "Script started"
backup
log_info "Script finished"
}
main
| النمط | الفائدة |
|---|---|
log_info() |
توحيد رسائل السجل |
main() |
نقطة دخول واضحة للسكربت |
أخطاء شائعة عند استخدام Functions في Bash
- نسيان تعريف الدالة قبل الاستدعاء في بعض البنى
- عدم استخدام
localمما يسبب تعارض متغيرات - الخلط بين return code والقيم النصية
- عدم اقتباس المتغيرات
"$1"عند الحاجة
تمرين عملي: دالة فحص ملف
#!/bin/bash
check_path() {
if [ -e "$1" ]; then
echo "Exists: $1"
else
echo "Missing: $1"
fi
}
check_path "/etc/passwd"
check_path "/tmp/not-found"
إذا أعطت الدالة نتيجة صحيحة لكل مسار، فقد أتقنت أساس Functions في Bash.
FAQ: أسئلة شائعة حول Bash Functions
ما فائدة Functions في Bash؟
تساعدك على إعادة استخدام الكود وتقسيم السكربت إلى أجزاء واضحة وسهلة الصيانة.
كيف أمرر arguments إلى دالة في Bash؟
تمرر القيم عند استدعاء الدالة وتقرأها داخلها عبر $1 و$2 وغيرها مثل السكربت الرئيسي.
كيف ترجع الدالة قيمة في Bash؟
يمكنها إرجاع status code عبر return، أو طباعة قيمة عبر echo ثم التقاطها command substitution.