دليل البرمجة النصية (Shell Scripting) من مبتدئ إلى محترف
في هذا الموضوع و من خلال مدونة العرائش التقنية سوف نتعرف على نتعلم أساسيات Bash وبيئة Shell خطوة بخطوة مع أمثلة عملية ومشاريع حقيقية، و وصولاً إلى أفضل الممارسات والموارد المتقدمة.
البرمجة والمفاهيم التأسيسية
1. مقدمة إلى عالم Shell Scripting
البرمجة النصية للشل (Shell Scripting) هي فن كتابة سلسلة من الأوامر لنظام التشغيل لتنفيذها تلقائياً، و تعتبر هذه المهارة من أهم الأدوات التي يجب على كل مسؤول أنظمة، مبرمج، أو حتى مستخدم عادي يتعامل مع أنظمة تشغيل مثل لينكس ويونكس أن يتقنها.
ما هي البرمجة النصية للشل ولماذا هي مهمة؟
البرمجة النصية للشل هي طريقة لأتمتة المهام المتكررة والمعقدة في أنظمة التشغيل المشابهة للينكس، وبدلاً من كتابة الأوامر يدوياً في الطرفية (Terminal) كل مرة، يمكنك كتابة سكريبت واحد ينفذ جميع المهام تلقائياً.
فوائد الأتمتة بإستخدام Shell Scripts:
- توفير الوقت: تنفيذ مهام معقدة في ثوانٍ بدلاً من دقائق أو ساعات
- تجنب الأخطاء البشرية: التنفيذ المتسق والدقيق لكل مرة
- التكرارية: ability to run the same process identically multiple times
- الجدولة: ability to schedule scripts to run at specific times using cron
الفرق بين Terminal, Shell, و Console:
المصطلح | الوصف |
---|---|
الطرفية (Terminal) | واجهة نصية لإدخال الأوامر وعرض output |
الصدفة (Shell) | مفسر الأوامر الذي ينفذ الأوامر ويتفاعل مع النظام |
كونسول (Console) | واجهة فيزيائية أو افتراضية لنظام التشغيل |
2. تهيئة بيئة العمل
لبدء رحلة البرمجة النصية، تحتاج إلى إعداد بيئة العمل المناسبة، لأن معظم أنظمة لينكس وmacOS تأتي مع shell مدمج، لكن يمكنك تثبيت وتحسين بيئة العمل حسب احتياجاتك.
كيفية الوصول إلى Terminal في لينكس وmacOS:
- في لينكس: Ctrl+Alt+T أو البحث عن "Terminal" في قائمة التطبيقات
- في macOS: البحث عن "Terminal" في Spotlight (Cmd+Space) أو في مجلد Utilities
- في Windows: استخدام WSL (Windows Subsystem for Linux) أو Git Bash
أنواع Shells المختلفة:
نوع Shell | المميزات | الاستخدام الشائع |
---|---|---|
Bash (Bourne-Again SHell) | الأكثر شيوعاً، توافق عالي، دعم ممتاز للبرمجة النصية | الإعداد الافتراضي في معظم توزيعات لينكس |
Zsh (Z Shell) | ميزات متقدمة للإكمال التلقائي، themes قابلة للتخصيص | مطورين يبحثون عن تجربة طرفية محسنة |
sh (Bourne Shell) | shell أصلي، بسيط وخفيف | سكريبتات تتطلب توافقاً عاليًا بين الأنظمة |
تثبيت وتجهيز بيئة لينكس على ويندوز عبر WSL:
- فتح PowerShell كمسؤول
- تنفيذ الأمر:
wsl --install
- إعادة تشغيل النظام عند الطلب
- اختيار توزيعة لينكس من Microsoft Store (مثل Ubuntu)
- إنشاء اسم مستخدم وكلمة مرور لنظام لينكس
3. أول خطواتك: كتابة وتنفيذ أول سكريبت لك
الآن بعد أن أصبحت بيئة العمل جاهزة، لننشئ أول سكريبت shell خاص بنا.
هيكل ملف Shell Script الأساسي:
كل سكريبت shell يبدأ عادةً بـ "shebang" (#!) يليه مسار المفسر الذي سينفذ السكريبت. السطر الثاني هو المكان المناسب لتعليقات توضح الغرض من السكريبت.
#!/bin/bash
# هذا هو أول سكريبت لي
# الغرض: عرض تحية بسيطة
echo "مرحباً بك في عالم البرمجة النصية!"
كيفية جعل الملف قابلاً للتنفيذ:
بعد حفظ الملف (مثل hello.sh
)، تحتاج إلى جعله قابلاً للتنفيذ باستخدام الأمر chmod
:
chmod +x hello.sh
طرق تنفيذ السكريبت:
- طريقة مباشرة مع bash:
bash hello.sh
- تنفيذ الملف مباشرة:
./hello.sh
(يتطلب صلاحيات تنفيذ) - إستخدام source:
source hello.sh
(ينفذ السكريبت في shell الحالي)
لغة Bash: من الأساسيات إلى المتقدم
4. المتغيرات والعمل معها
المتغيرات هي عناصر أساسية في أي لغة برمجة، وتستخدم لتخزين البيانات وإعادة إستخدامها.
تعريف المتغيرات وإستخدامها:
#!/bin/bash
# تعريف متغير
اسم_المستخدم="أحمد"
# استخدام المتغير
echo "مرحباً $اسم_المستخدم"
echo "المسكن الحالي: $HOME"
أنواع المتغيرات:
نوع المتغير | الوصف | مثال |
---|---|---|
محلي (Local) | متغير متاح فقط في السكريبت الحالي | var="قيمة" |
بيئة (Environment) | متغير متاح لجميع العمليات الفرعية | export VAR="قيمة" |
خاص (Special) | متغيرات محددة مسبقاً من قبل shell | $0 , $1 , $# , $? |
إدخال البيانات من المستخدم (أمر read
):
#!/bin/bash
echo "ما هو اسمك؟"
read name
echo "مرحباً $name! كم عمرك؟"
read age
echo "عمرك هو $age سنة"
5. التعابير النمطية (Wildcards) والتوسيع (Expansion)
التعابير النمطية هي رموز خاصة تساعد في مطابقة patterns مع أسماء الملفات أو النصوص.
الرمز | الوصف | مثال |
---|---|---|
* |
يطابق أي عدد من أي حرف | *.txt تطابق جميع ملفات النصوص |
? |
يطابق حرف واحد فقط | file?.txt تطابق file1.txt, fileA.txt |
[] |
يطابق نطاق أو مجموعة أحرف | file[1-3].txt تطابق file1.txt, file2.txt, file3.txt |
أنواع التوسيع في Bash:
-
التوسيع الحسابي:
$(( expression ))
result=$((5 + 3 * 2)) echo $result # الناتج: 11
-
توسيع الأوامر:
$(command)
today=$(date) echo "تاريخ اليوم: $today"
-
توسيع الأقواس:
{string1,string2,...}
echo file{1,2,3}.txt # الناتج: file1.txt file2.txt file3.txt
6. أوامر التحكم وتدفق البرنامج
if [ condition ]; then
# الأوامر إذا كان الشرط صحيحاً
else
# الأوامر إذا كان الشرط خاطئاً
fi
#!/bin/bash
# مقارنة números
if [ $1 -gt 10 ]; then
echo "الرقم أكبر من 10"
else
echo "الرقم 10 أو أقل"
fi
# التحقق من وجود ملف
if [ -f "ملف.txt" ]; then
echo "الملف موجود"
else
echo "الملف غير موجود"
fi
# مقارنة strings
if [ "$name" = "أحمد" ]; then
echo "مرحباً أحمد"
fi
العامل | الوصف | مثال |
---|---|---|
-eq | يساوي (equal) | [ $a -eq $b ] |
-ne | لا يساوي (not equal) | [ $a -ne $b ] |
-gt | أكبر من (greater than) | [ $a -gt $b ] |
-lt | أقل من (less than) | [ $a -lt $b ] |
-ge | أكبر أو يساوي (greater or equal) | [ $a -ge $b ] |
-le | أقل أو يساوي (less or equal) | [ $a -le $b ] |
= | تساوي strings | [ "$a" = "$b" ] |
!= | لا تتساوي strings | [ "$a" != "$b" ] |
7. الحلقات التكرارية (Loops)
حلقة for:
# التكرار على قائمة قيم
for i in 1 2 3 4 5
do
echo "الرقم: $i"
done
# التكرار على مجموعة ملفات
for file in *.txt
do
echo "معالجة الملف: $file"
done
# التكرار بنطاق رقمي
for i in {1..5}
do
echo "التكرار رقم $i"
done
# التكرار مع increment
for i in {0..10..2}
do
echo "الرقم: $i"
done
حلقة while:
# عداد تقليدي
counter=1
while [ $counter -le 5 ]
do
echo "العد: $counter"
((counter++))
done
# القراءة من ملف سطراً سطراً
while IFS= read -r line
do
echo "سطر: $line"
done < "ملف.txt"
# حلقة لا نهائية (بحاجة لشرط break)
while true
do
echo "ما زلت أعمل..."
sleep 1
done
حلقة until:
count=1
until [ $count -gt 5 ]
do
echo "العد: $count"
((count++))
done
التحكم في الحلقات (break
و continue
):
for i in {1..10}
do
if [ $i -eq 5 ]; then
break # يخرج عند الوصول إلى 5
fi
echo "الرقم: $i"
done
for i in {1..10}
do
if [ $((i % 2)) -eq 0 ]; then
continue # يتخطى الأرقام الزوجية
fi
echo "الرقم الفردي: $i"
done
8. الدوال (Functions)
تعريف واستدعاء الدوال:
#!/bin/bash
# تعريف دالة
تحية() {
echo "مرحباً $1!"
echo "اليوم هو $(date)"
}
# استدعاء الدالة
تحية "أحمد"
تحية "محمد"
تمرير المعطيات إلى الدوال:
جمع() {
local sum=$(( $1 + $2 ))
echo "مجموع $1 و $2 هو: $sum"
}
جمع 5 3
نطاق المتغيرات (Scope):
متغير_عام="أنا متغير عام"
دالة_اختبار() {
local متغير_محلي="أنا متغير محلي"
echo "داخل الدالة: $متغير_عام"
echo "داخل الدالة: $متغير_محلي"
}
دالة_اختبار
echo "خارج الدالة: $متغير_عام"
echo "خارج الدالة: $متغير_محلي" # هذا سيعطي خطأ لأن المتغير غير معرف
المعالجة المتقدمة وإدارة المهام
9. معالجة النصوص والملفات
أدوات معالجة النصوص الأساسية:
الأداة | الوصف | مثال |
---|---|---|
grep | البحث عن patterns في النص | grep "كلمة" ملف.txt |
sed | محرر نصوص للتدفقات (stream editor) | sed 's/قديم/جديد/g' ملف.txt |
awk | لغة برمجة كاملة لمعالجة النصوص | awk '{print $1}' ملف.txt |
cut | استخراج أجزاء من السطور | cut -d: -f1 /etc/passwd |
sort | ترتيب السطور | sort ملف.txt |
uniq | إزالة أو عرض السطور المكررة | uniq ملف.txt |
أمثلة عملية:
# البحث عن كلمة في ملف
grep "error" /var/log/syslog
# استبدال نص في ملف
sed -i 's/old-text/new-text/g' file.txt
# عرض الحقل الأول من ملف مفصول بفاصلة
awk -F',' '{print $1}' data.csv
# عد عدد مرات ظهور كل سطر
sort file.txt | uniq -c
# عرض أول 10 سطور من ملف
head -n 10 large_file.txt
# عرض آخر 10 سطور من ملف
tail -n 10 large_file.txt
التوجيه (Redirection) والأنابيب (Piping):
# حفظ output في ملف (استبدال الملف)
ls -l > list.txt
# إضافة output إلى نهاية ملف
echo "سطر جديد" >> list.txt
# توجيه errors إلى ملف
some_command 2> errors.log
# توجيه output وerrors إلى ملف
another_command &> all_output.log
# استخدام أنابيب لربط أوامر متعددة
cat file.txt | grep "important" | sort | uniq > result.txt
# توجيه input من ملف
wc -l < file.txt
10. إدارة العمليات والإشارات (Processes & Signals)
تشغيل العمليات في الخلفية:
# تشغيل عملية في الخلفية
long_running_command &
# تشغيل عدة عمليات في الخلفية
command1 &
command2 &
command3 &
# نقل عملية من الأمامية إلى الخلفية
# اضغط Ctrl+Z لإيقاف العملية مؤقتاً
# ثم اكتب bg لإرسالها إلى الخلفية
إدارة الوظائف (jobs):
الأمر | الوصف |
---|---|
jobs | عرض قائمة الوظائف في الخلفية |
fg %n | إحضار الوظيفة n إلى الأمامية |
bg %n | إرسال الوظيفة n إلى الخلفية |
kill %n | إنهاء الوظيفة n |
الإشارات (Signals):
الإشارة | القيمة | الوصف |
---|---|---|
SIGHUP | 1 | إغلاق الطرفية (hang up) |
SIGINT | 2 | مقاطعة من لوحة المفاتيح (Ctrl+C) |
SIGQUIT | 3 | quit من لوحة المفاتيح (Ctrl+\) |
SIGKILL | 9 | إنهاء فوري (لا يمكن الاعتراض) |
SIGTERM | 15 | إنهاء gracefully (الافتراضي لـ kill) |
SIGSTOP | 17,19,23 | إيقاف مؤقت (لا يمكن الاعتراض) |
التعامل مع الإشارات بإستخدام trap
:
#!/bin/bash
# دالة التنظيف
تنظيف() {
echo "جارٍ التنظيف قبل الخروج..."
rm -f /tmp/temp_file.txt
exit
}
# الاعتراض على إشارات الخروج
trap تنظيف SIGINT SIGTERM
# السكريبت الرئيسي
echo "انطلق السكريبت (PID: $$)"
echo "اضغط Ctrl+C لاختبار التنظيف"
# حلقة لا نهائية للتوضيح
while true; do
sleep 1
done
البرمجة الإحترافية والتطبيقات العملية
11. التصحيح ومعالجة الأخطاء (Debugging)
تمكين وضع التصحيح:
# تشغيل السكريبت مع تفعيل التصحيح
bash -x script.sh
# تفعيل التصحيح داخل السكريبت
set -x # تشغيل tracing
# بعض الأوامر
set +x # إيقاف tracing
# تفعيل التصحيح عند استخدام متغير غير معرف
set -u
# جعل السكريبت يخرج عند أول error
set -e
# تفعيل جميع خيارات التصحيح
set -xe
تسجيل الأخطاء (Logging):
#!/bin/bash
# إعداد التسجيل
LOG_FILE="script.log"
exec > >(tee -a "$LOG_FILE") 2>&1
# دالة لتسجيل الرسائل
تسجيل() {
local level=$1
local message=$2
echo "$(date '+%Y-%m-%d %H:%M:%S') [$level] $message" >> "$LOG_FILE"
# أيضاً عرض على الشاشة إذا كان مستوى ERROR
if [ "$level" = "ERROR" ]; then
echo "$message" >&2
fi
}
# أمثلة على الاستخدام
تسجيل "INFO" "بدء السكريبت"
تسجيل "ERROR" "حدث خطأ ما"
تسجيل "INFO" "انتهاء السكريبت"
12. كتابة نصوص قوية وآمنة (Robust Scripting)
التعامل مع المسارات التي تحتوي على مسافات:
# الطريقة الخاطئة (ستفشل إذا كان هناك مسافات)
for file in $(ls /path/with spaces); do
echo "$file"
done
# الطريقة الصحيحة (استخدام find مع while و IFS)
find /path/with spaces -type f -print0 | while IFS= read -r -d '' file; do
echo "معالجة: $file"
done
الاقتباسات والهروب:
# الفرق بين الاقتباسات
variable="قيمة مع مسافات"
echo $variable # قد يسبب مشاكل مع المسافات
echo "$variable" # آمن مع المسافات والقيم الخاصة
echo '$variable' # يعرض النص حرفياً (لا يتم تفسير المتغير)
# الهروب من الأحرف الخاصة
echo "السعر هو \$100" # يعرض: السعر هو $100
echo "هذا يحتوي على \"اقتباسات\"" # يعرض: هذا يحتوي على "اقتباسات"
أفضل الممارسات للأمان:
- عدم الثقة في المدخلات: التحقق دائماً من صحة المدخلات
- إستخدام مسارات مطلقة: لتجنب مشاكل المسار النسبي
- التحقق من أذونات الملفات: قبل القراءة أو الكتابة
- إستخدام كلمات مرور آمنة: تخزينها بشكل آمن أو إستخدام مفاتيح SSH
# التحقق من صحة المدخلات
if [ -z "$1" ]; then
echo "خطأ: يجب توفير معامل" >&2
exit 1
fi
# التحقق من وجود ملف قبل معالجته
if [ ! -f "$file" ]; then
echo "خطأ: الملف $file غير موجود" >&2
exit 1
fi
# استخدام مسارات مطلقة
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="$SCRIPT_DIR/config.cfg"
13. مشاريع عملية لتطبيق ما تعلمته
مشروع 1: سكريبت لنسخ إحتياطي تلقائي
#!/bin/bash
# سكريبت النسخ الاحتياطي
# المؤلف: [اسمك]
# التاريخ: $(date +%Y-%m-%d)
# الوصف: نسخ احتياطي للملفات المهمة ورفعها إلى خادم بعيد
# إعداد المتغيرات
BACKUP_DIR="/home/$(whoami)/backups"
SOURCE_DIRS=("/home/$(whoami)/documents" "/home/$(whoami)/images")
REMOTE_SERVER="user@remote-server:/backups"
RETENTION_DAYS=7
# إنشاء مجلد النسخ الاحتياطي إذا لم يكن موجوداً
mkdir -p "$BACKUP_DIR"
# إنشاء اسم ملف النسخ الاحتياطي
BACKUP_FILE="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).tar.gz"
# تسجيل بدء النسخ الاحتياطي
echo "$(date): بدء النسخ الاحتياطي إلى $BACKUP_FILE" >> "$BACKUP_DIR/backup.log"
# إنشاء الأرشيف
tar -czf "$BACKUP_FILE" "${SOURCE_DIRS[@]}" 2>> "$BACKUP_DIR/backup.log"
# التحقق من نجاح الإنشاء
if [ $? -eq 0 ]; then
echo "$(date): تم إنشاء الأرشيف بنجاح" >> "$BACKUP_DIR/backup.log"
# مزامنة مع الخادم البعيد (إذا كان متاحاً)
if command -v rsync &> /dev/null; then
rsync -avz "$BACKUP_FILE" "$REMOTE_SERVER" >> "$BACKUP_DIR/backup.log" 2>&1
fi
# تنظيف الملفات القديمة
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete >> "$BACKUP_DIR/backup.log"
else
echo "$(date): فشل في إنشاء الأرشيف" >> "$BACKUP_DIR/backup.log"
exit 1
fi
echo "$(date): اكتمل النسخ الاحتياطي بنجاح" >> "$BACKUP_DIR/backup.log"
مشروع 2: سكريبت لمراقبة مساحة القرص وإرسال تنبيه
#!/bin/bash
# سكريبت مراقبة مساحة القرص
# الوصف: مراقبة مساحة القرص وإرسال إشعار عند تجاوز حد معين
# الحدود (يمكن تعديلها)
DISK_USAGE_WARNING=80
DISK_USAGE_CRITICAL=90
EMAIL_RECIPIENT="admin@example.com"
# الحصول على استخدام القرص
disk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
# التحقق من الحالة وإرسال التنبيه
if [ "$disk_usage" -ge "$DISK_USAGE_CRITICAL" ]; then
# حالة حرجة
subject="تنبيه حرج: مساحة القرص ممتلئة بنسبة ${disk_usage}%"
message="مساحة القرص على الخادم $(hostname) وصلت إلى مستوى حرج: ${disk_usage}%"
# إرسال البريد (إذا كان mailx مثبتاً)
if command -v mailx &> /dev/null; then
echo "$message" | mailx -s "$subject" "$EMAIL_RECIPIENT"
fi
# أيضاً عرض تحذير على الشاشة
echo "تحذير: $message" >&2
exit 2
elif [ "$disk_usage" -ge "$DISK_USAGE_WARNING" ]; then
# حالة تحذير
subject="تحذير: مساحة القرص ممتلئة بنسبة ${disk_usage}%"
message="مساحة القرص على الخادم $(hostname) وصلت إلى مستوى تحذير: ${disk_usage}%"
if command -v mailx &> /dev/null; then
echo "$message" | mailx -s "$subject" "$EMAIL_RECIPIENT"
fi
echo "تحذير: $message" >&2
exit 1
else
# كل شيء طبيعي
echo "مساحة القرص: ${disk_usage}% (طبيعي)"
exit 0
fi
مشروع 3: سكريبت لإعداد وتكوين بيئة تطوير جديدة
#!/bin/bash
# سكريبت إعداد بيئة التطوير
# الوصف: تثبيت وتكوين أدوات التطوير على نظام جديد
# الألوان لل输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# دالة للتسجيل الملون
log() {
local level=$1
local message=$2
case $level in
"INFO")
echo -e "${GREEN}[INFO]${NC} $message"
;;
"WARN")
echo -e "${YELLOW}[WARN]${NC} $message"
;;
"ERROR")
echo -e "${RED}[ERROR]${NC} $message" >&2
;;
esac
}
# التحقق من أن السكريبت يعمل كـ root
if [ "$EUID" -ne 0 ]; then
log "ERROR" "يجب تشغيل السكريبت كـ root (استخدم sudo)"
exit 1
fi
# تحديث النظام
log "INFO" "جارٍ تحديث قائمة الحزم..."
apt update
log "INFO" "جارٍ ترقية النظام..."
apt upgrade -y
# تثبيت الحزم الأساسية
packages=(
"git"
"curl"
"wget"
"vim"
"build-essential"
"python3"
"python3-pip"
"nodejs"
"npm"
"default-jdk"
)
log "INFO" "جارٍ تثبيت الحزم الأساسية..."
for pkg in "${packages[@]}"; do
if dpkg -l | grep -q "^ii $pkg "; then
log "INFO" "الحزمة $pkg مثبتة مسبقاً"
else
log "INFO" "تثبيت $pkg..."
apt install -y "$pkg"
fi
done
# تثبيت أدوات إضافية
log "INFO" "تثبيت أدوات إضافية..."
# Docker
if ! command -v docker &> /dev/null; then
log "INFO" "تثبيت Docker..."
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
usermod -aG docker "$SUDO_USER"
rm get-docker.sh
else
log "INFO" "Docker مثبت مسبقاً"
fi
# تكوين git
log "INFO" "تكوين Git..."
if command -v git &> /dev/null; then
git config --global user.name "اسمك"
git config --global user.email "بريدك@example.com"
git config --global core.editor "vim"
fi
# إنشاء مجلدات العمل
log "INFO" "إنشاء مجلدات العمل..."
mkdir -p "/home/$SUDO_USER/workspace"
mkdir -p "/home/$SUDO_USER/scripts"
# إعداد الأذونات
chown -R "$SUDO_USER:$SUDO_USER" "/home/$SUDO_USER/workspace"
chown -R "$SUDO_USER:$SUDO_USER" "/home/$SUDO_USER/scripts"
log "INFO" "اكتمل الإعداد! يوصى بإعادة التشغيل."
الخاتمة والموارد
14. الخطوات التالية في رحلتك
مواضيع متقدمة للاستكشاف:
- برمجة Expect: لأتمتة البرامج التفاعلية
- البرمجة المتقدمة بـ awk: لمعالجة بيانات معقدة
- البرمجة المتقدمة بـ sed: لتحويل نصوص معقدة
- إنشاء حزم Debian: لتوزيع سكريبتاتك كحزم مثبتة
- التكامل مع أنظمة CI/CD: مثل Jenkins, GitLab CI
موارد للتعلّم المستمر:
- الوثائق الرسمية:
man bash
- وثائق bash الرسمية- دليل Bash للمبتدئين
- كتب ممتازة:
- Linux Command Line and Shell Scripting Bible — Richard Blum
- Classic Shell Scripting — Arnold Robbins, Nelson H.F. Beebe
- مواقع إلكترونية:
- مجتمعات:
15. ملخص وأفضل الممارسات النهائية
- ابدأ كل سكريبت بـ shebang (
#!/bin/bash
) - إستخدم متغيرات ذات أسماء واضحة وموصلة بشرطات سفلية
- تحقق دائمًا من صحة المدخلات ووجود الملفات
- إستخدم الإقتباسات حول المتغيرات لمنع problems التقسيم
- إستخدم
set -e
لجعل السكريبت يخرج عند أول error - إستخدم
set -u
للكشف عن المتغيرات غير المعرفة - إستخدم التصحيح (
set -x
) عند الحاجة - أكتب تعليقات واضحة تشرح لماذا وليس ماذا
نصائح نهائية لكتابة سكريبتات نظيفة وفعّالة:
- حافظ على البساطة: كلما كان السكريبت أبسط، كان أسهل في الصيانة
- أعد استخدام الكود: إستخدم الدوال للمنطق المتكرر
- تحقق من الأخطاء: تحقق دائمًا من أكواد الخروج للأوامر
- إستخدم التنسيق المتسق: المسافات البادئة، التسمية، etc.
- إختبر بشكل شامل: إختبر سكريبتاتك في بيئات مختلفة
- وثّق بشكل جيد: إشرح كيف ومتى ولماذا يستخدم السكريبت
مصادر وإسناد:
هذا الدليل هو عمل أصلي تم إعداده في 2025 بناءً على الخبرة العملية والمراجع المفتوحة.