تم اكتشاف مانع الإعلانات! ❌

يبدو أنك تستخدم مانع إعلانات. هذا الموقع يعتمد على الإعلانات لتقديم محتوى مجاني.

يرجى تعطيل مانع الإعلانات لدعمنا!

البرمجة النصية (Shell Scripting) من الصفر إلى الإحتراف

دليل البرمجة النصية (Shell Scripting) من مبتدئ إلى محترف

في هذا الموضوع و من خلال مدونة العرائش التقنية سوف نتعرف على نتعلم أساسيات Bash وبيئة Shell خطوة بخطوة مع أمثلة عملية ومشاريع حقيقية، و وصولاً إلى أفضل الممارسات والموارد المتقدمة.


البرمجة النصية (Shell Scripting) من الصفر إلى الإحتراف

البرمجة والمفاهيم التأسيسية

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:

  1. فتح PowerShell كمسؤول
  2. تنفيذ الأمر: wsl --install
  3. إعادة تشغيل النظام عند الطلب
  4. اختيار توزيعة لينكس من Microsoft Store (مثل Ubuntu)
  5. إنشاء اسم مستخدم وكلمة مرور لنظام لينكس

3. أول خطواتك: كتابة وتنفيذ أول سكريبت لك

الآن بعد أن أصبحت بيئة العمل جاهزة، لننشئ أول سكريبت shell خاص بنا.

هيكل ملف Shell Script الأساسي:

كل سكريبت shell يبدأ عادةً بـ "shebang" (#!) يليه مسار المفسر الذي سينفذ السكريبت. السطر الثاني هو المكان المناسب لتعليقات توضح الغرض من السكريبت.

#!/bin/bash

# هذا هو أول سكريبت لي
# الغرض: عرض تحية بسيطة

echo "مرحباً بك في عالم البرمجة النصية!"

كيفية جعل الملف قابلاً للتنفيذ:

بعد حفظ الملف (مثل hello.sh)، تحتاج إلى جعله قابلاً للتنفيذ باستخدام الأمر chmod:

chmod +x hello.sh

طرق تنفيذ السكريبت:

  1. طريقة مباشرة مع bash: bash hello.sh
  2. تنفيذ الملف مباشرة: ./hello.sh (يتطلب صلاحيات تنفيذ)
  3. إستخدام 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:

  1. التوسيع الحسابي: $(( expression ))
    result=$((5 + 3 * 2))
    echo $result  # الناتج: 11
  2. توسيع الأوامر: $(command)
    today=$(date)
    echo "تاريخ اليوم: $today"
  3. توسيع الأقواس: {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):

الإشارة القيمة الوصف
SIGHUP1إغلاق الطرفية (hang up)
SIGINT2مقاطعة من لوحة المفاتيح (Ctrl+C)
SIGQUIT3quit من لوحة المفاتيح (Ctrl+\)
SIGKILL9إنهاء فوري (لا يمكن الاعتراض)
SIGTERM15إنهاء gracefully (الافتراضي لـ kill)
SIGSTOP17,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 "هذا يحتوي على \"اقتباسات\""  # يعرض: هذا يحتوي على "اقتباسات"

أفضل الممارسات للأمان:

  1. عدم الثقة في المدخلات: التحقق دائماً من صحة المدخلات
  2. إستخدام مسارات مطلقة: لتجنب مشاكل المسار النسبي
  3. التحقق من أذونات الملفات: قبل القراءة أو الكتابة
  4. إستخدام كلمات مرور آمنة: تخزينها بشكل آمن أو إستخدام مفاتيح 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

موارد للتعلّم المستمر:

  1. الوثائق الرسمية:
  2. كتب ممتازة:
    • Linux Command Line and Shell Scripting Bible — Richard Blum
    • Classic Shell Scripting — Arnold Robbins, Nelson H.F. Beebe
  3. مواقع إلكترونية:
  4. مجتمعات:

15. ملخص وأفضل الممارسات النهائية

  1. ابدأ كل سكريبت بـ shebang (#!/bin/bash)
  2. إستخدم متغيرات ذات أسماء واضحة وموصلة بشرطات سفلية
  3. تحقق دائمًا من صحة المدخلات ووجود الملفات
  4. إستخدم الإقتباسات حول المتغيرات لمنع problems التقسيم
  5. إستخدم set -e لجعل السكريبت يخرج عند أول error
  6. إستخدم set -u للكشف عن المتغيرات غير المعرفة
  7. إستخدم التصحيح (set -x) عند الحاجة
  8. أكتب تعليقات واضحة تشرح لماذا وليس ماذا

نصائح نهائية لكتابة سكريبتات نظيفة وفعّالة:

  1. حافظ على البساطة: كلما كان السكريبت أبسط، كان أسهل في الصيانة
  2. أعد استخدام الكود: إستخدم الدوال للمنطق المتكرر
  3. تحقق من الأخطاء: تحقق دائمًا من أكواد الخروج للأوامر
  4. إستخدم التنسيق المتسق: المسافات البادئة، التسمية، etc.
  5. إختبر بشكل شامل: إختبر سكريبتاتك في بيئات مختلفة
  6. وثّق بشكل جيد: إشرح كيف ومتى ولماذا يستخدم السكريبت

مصادر وإسناد:
هذا الدليل هو عمل أصلي تم إعداده في 2025 بناءً على الخبرة العملية والمراجع المفتوحة.

أحدث أقدم

نموذج الاتصال