سكربتات الشل: أتمتة ما تكرره
درس 10 من 11
10سكربتات الشل: أتمتة ما تكرره
الصورة الكبيرةالمهندس الكسول بالطريقة الصحيحة يكتب سكربتًا مرة ويوفّر ساعات. النسخ الاحتياطي، تجهيز المشروع، تنظيف الملفات: كلها سكربتات من عشرة أسطر.
ماذا تشاهد في الرسم: من أوامر متفرّقة إلى ملف يُشغّل بأمر واحد ويخبرك إن نجح أو فشل.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
السكربت مثل وصفة مطبخ مكتوبة: بدل أن تتذكّر كل مرة «سخّن، ثم أضف، ثم حرّك»، تقرأ الورقة. والمتغيرات فراغات في الوصفة («كمية الأرز: ___») تملؤها كل مرة بحسب عدد الضيوف.
سكربت bash ملف نصّي بخط shebang يحدّد المفسّر وصلاحية تنفيذ. المعاملات الموضعية $1..$9 و$@ و$#، والتوسّع ${var:-default}. [[ ]] للاختبارات، و$? رمز خروج آخر أمر. set -e يوقف عند أول فشل، -u يمنع المتغيرات غير المعرّفة، وpipefail يكشف الفشل داخل الأنابيب. استخدم shellcheck لكشف الأخطاء الشائعة.
قبل أن تبدأ
🔎أوامر لينكس اليومية
تعرف find وgrep وtar.
🔐الصلاحيات
تعرف chmod.
الفكرة الجوهرية
1السكربت الأول
السطر الأول يقول للنظام أي برنامج يقرأ الملف. ثم أوامرك كما تكتبها في الطرفية. اعطه صلاحية التنفيذ وشغّله بـ ./.
#!/usr/bin/env bash set -euo pipefail echo "Today is $(date +%F)" echo "You are in $PWD"
chmod +x hello.sh ./hello.sh
2المتغيرات والمعاملات
name="Sara" بلا مسافات حول =. تقرؤه بـ "$name". وما تكتبه بعد اسم السكربت يصل كـ $1 و$2.
rm $file. لو كان اسم الملف فيه مسافة «my notes.txt» يحاول حذف ملفين: my وnotes.txt. اكتب دائمًا "$file".3الشروط والحلقات
if [[ -d "$dir" ]] يسأل «هل هذا مجلد؟»، وfor f in *.txt يمرّ على كل ملف نصّي.
#!/usr/bin/env bash
set -euo pipefail
dir="${1:-.}" # first argument, or the current folder
if [[ ! -d "$dir" ]]; then
echo "not a folder: $dir" >&2
exit 1
fi
count=0
for f in "$dir"/*.txt; do
[[ -e "$f" ]] || continue
lines=$(wc -l < "$f")
echo "$f: $lines lines"
count=$((count + 1))
done
echo "$count text files"4رمز الخروج: هل نجح؟
كل أمر ينتهي برقم: 0 نجاح، وأي رقم آخر فشل. $? يعطيك رمز آخر أمر، و&& يشغّل التالي فقط إن نجح السابق، و|| إن فشل. سكربتك يجب أن يخرج بـ exit 1 عند الخطأ حتى تعرف الأدوات الأخرى أنه فشل.
مثال محلول
المسألة: كل يوم تضغط مجلد notes باسم فيه التاريخ وتحتفظ بآخر 7 نسخ. الحل:
#!/usr/bin/env bash
set -euo pipefail
src="${1:?usage: backup.sh <folder>}"
dest="$HOME/backups"
mkdir -p "$dest"
file="$dest/$(basename "$src")-$(date +%F).tar.gz"
tar -czf "$file" "$src"
echo "saved $file"
# keep the newest 7, delete the rest
ls -1t "$dest"/*.tar.gz | tail -n +8 | xargs -r rm --خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| السكربتات للمسؤولين عن الأنظمة فقط. | كل مطوّر يكتب سكربتات لتجهيز المشروع والاختبار والنشر. |
| بايثون دائمًا أفضل من bash. | لربط أوامر الشل ببعض، bash أقصر. حين يكبر المنطق والحسابات انتقل لبايثون. |
اختبر فهمك
ماذا يفعل set -e في أول السكربت؟
بدونه يكمل السكربت بعد الفشل وقد يحذف أو يكتب في المكان الخطأ.
شغّلت ./run.sh photos 3. ما قيمة $2؟
$1 أول معامل بعد الاسم، و$2 الثاني.
ما رمز الخروج الذي يعني النجاح؟
في الشل الصفر نجاح وأي رقم غيره نوع من الفشل.
بطاقات مراجعة سريعة
#!/usr/bin/env bash الذي يحدّد المفسّر.تحقق من فهمك
لماذا نكتب "$file" بعلامات تنصيص؟
حتى يبقى الاسم كلمة واحدة لو فيه مسافات أو رموز، فلا يتحوّل لعدة معاملات.
كيف تعطي معاملًا قيمة افتراضية؟
dir="${1:-.}" تأخذ $1 أو . إن لم يُمرَّر.
متى تنتقل من bash إلى بايثون؟
حين يكثر المنطق والحسابات وهياكل البيانات، أو يتجاوز السكربت صفحة.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.