💻

Bash Scripting

لغة الأتمتة الأساسية لكل مهندس DevOps. تعلّم كتابة سكريبتات قوية لإدارة الخوادم وأتمتة المهام المتكررة.

أساسي مفتوح المصدر Linux & macOS

📖 ما هو Bash؟

Bourne Again Shell

Bash هو مترجم أوامر (Shell) لنظام Unix/Linux، وهو الخيار الافتراضي في معظم التوزيعات. يتيح لك التفاعل مع النظام عبر سطر الأوامر وكتابة سكريبتات لأتمتة المهام المعقدة. كل مهندس DevOps يحتاج إتقان Bash لأنه الأداة الأساسية للتعامل مع الخوادم.

💡 Bash ليس مجرد أوامر — إنه لغة برمجة كاملة تدعم المتغيرات، الحلقات، الشروط، والدوال.

🔧 الأوامر الأساسية

الأمرالوظيفةمثال
lsعرض محتويات المجلدls -la /home
cdتغيير المجلدcd /var/log
pwdعرض المسار الحاليpwd
cpنسخ ملفاتcp file.txt /backup/
mvنقل/إعادة تسميةmv old.txt new.txt
rmحذف ملفاتrm -rf /tmp/old
chmodتغيير الصلاحياتchmod 755 script.sh
chownتغيير المالكchown user:group file
grepالبحث في النصوصgrep "error" /var/log/syslog
findالبحث عن ملفاتfind / -name "*.conf"
tarضغط/فك ضغطtar -czvf backup.tar.gz /data
curlطلب HTTPcurl -s https://api.example.com

📝 كتابة أول سكريبت

hello.sh
#!/bin/bash # أول سكريبت Bash echo "مرحباً بك في عالم DevOps!" # استخدام المتغيرات NAME="DevOps Engineer" echo "أهلاً $NAME" # العمليات الحسابية A=10 B=20 echo "المجموع: $((A + B))"
Terminal — تشغيل السكريبت
# إعطاء صلاحية التنفيذ chmod +x hello.sh # تشغيل السكريبت ./hello.sh مرحباً بك في عالم DevOps! أهلاً DevOps Engineer المجموع: 30

🔀 الشروط والحلقات

conditions.sh
#!/bin/bash # شرط if/else AGE=25 if [ $AGE -ge 18 ]; then echo "بالغ" else echo "قاصر" fi # حلقة for for i in 1 2 3 4 5; do echo "الرقم: $i" done # حلقة while COUNT=0 while [ $COUNT -lt 5 ]; do echo "العد: $COUNT" ((COUNT++)) done # شرط case case $1 in start) echo "بدء الخدمة..." ;; stop) echo "إيقاف الخدمة..." ;; restart) echo "إعادة تشغيل الخدمة..." ;; *) echo "استخدام: $0 {start|stop|restart}" ;; esac

الدوال (Functions)

functions.sh
#!/bin/bash # تعريف دالة log_message() { TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") echo "[$TIMESTAMP] $1" } # دالة مع قيمة مرجعة check_service() { if systemctl is-active --quiet $1; then return 0 # نشط else return 1 # غير نشط fi } # استخدام الدوال log_message "بدء الفحص..." if check_service nginx; then log_message "Nginx يعمل بشكل طبيعي ✓" else log_message "Nginx متوقف ✗" fi

🚀 سكريبت عملي — نسخ احتياطي تلقائي

backup.sh
#!/bin/bash # سكريبت نسخ احتياطي تلقائي للمواقع BACKUP_DIR="/backup/website" DATE=$(date +%Y%m%d_%H%M%S) SOURCE="/var/www/html" RETENTION=7 # الاحتفاظ بـ 7 أيام # إنشاء مجلد النسخ الاحتياطي mkdir -p $BACKUP_DIR # إنشاء النسخة الاحتياطية tar -czf $BACKUP_DIR/backup_$DATE.tar.gz $SOURCE # حذف النسخ القديمة find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +$RETENTION -delete echo "✓ تم النسخ الاحتياطي: backup_$DATE.tar.gz"
Terminal — إضافة إلى crontab للتشغيل اليومي
# فتح محرر crontab crontab -e # إضافة السطر التالي (تشغيل يومياً الساعة 2 صباحاً) 0 2 * * * /path/to/backup.sh >> /var/log/backup.log 2>&1

🔗 الأنابيب وإعادة التوجيه

➡️

Pipe |

تمرير مخرج أمر كمدخل لأمر آخر. مثال: cat access.log | grep "404" | wc -l

📄

Redirect >

إعادة توجيه المخرج لملف (يكتب فوق المحتوى). مثال: echo "data" > file.txt

📎

Append >>

إضافة للملف بدون حذف المحتوى القديم. مثال: echo "log" >> app.log

⚠️

Error 2>

إعادة توجيه الأخطاء فقط. مثال: command 2> errors.log

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

🎯 1. ابدأ دائماً بـ #!/bin/bash (Shebang)
2. استخدم set -euo pipefail في بداية السكريبتات المهمة
3. استخدم علامات التنصيص المزدوجة للمتغيرات: "$VAR"
4. تحقق من وجود الأوامر قبل استخدامها: command -v docker
5. استخدم shellcheck لفحص السكريبتات: shellcheck script.sh
6. أضف تعليقات توضيحية لكل قسم
7. تعامل مع الأخطاء بشكل واضح
التالي: أساسيات Linux 🏠 خارطة الطريق