دليل ميسّر لكتابة سكربتات Shell
تعتبر سكربتات Shell واحدة من أهم الأدوات التي يستخدمها مهندسو البرمجيات، مسؤولو الأنظمة، والمطورون بشكل عام لإدارة الأنظمة، أتمتة المهام، وتحسين الإنتاجية. في عالم الحوسبة، تُعد كتابة سكربتات Shell مهارة أساسية لكل من يتعامل مع بيئات يونكس (Unix) أو لينكس (Linux) أو حتى أنظمة ماكنتوش (macOS). يقدم هذا المقال دليلاً شاملاً ومفصلاً لكتابة سكربتات Shell، يشرح الأساسيات وصولاً إلى المفاهيم المتقدمة، مع التركيز على الجانب العملي والنظري معاً.
1. مقدمة حول سكربتات Shell
الـ Shell هو برنامج يعمل كواجهة بين المستخدم ونظام التشغيل، وهو يتلقى الأوامر وينفذها. هناك عدة أنواع من Shells مثل Bash، Zsh، Ksh، وTcsh، لكن أكثرها شيوعاً واستخداماً هو Bash (Bourne Again Shell) الذي يعتبر معياراً في أغلب توزيعات لينكس.
سكربت Shell هو ملف نصي يحتوي على مجموعة من الأوامر التي يتم تنفيذها بشكل متتابع تلقائياً عند تشغيل السكربت. تكمن قوة سكربتات Shell في قدرتها على أتمتة الإجراءات المعقدة، التكرارية، والتعامل مع ملفات النظام، العمليات، والتطبيقات بسهولة.
2. بداية كتابة سكربت Shell
2.1. اختيار محرر النصوص
يمكنك كتابة سكربتات Shell باستخدام أي محرر نصوص عادي مثل Nano, Vim, Emacs أو حتى محررات متقدمة مثل VS Code. يكفي أن يكون الملف بصيغة نصية عادية بدون تنسيق.
2.2. إنشاء ملف سكربت
ابدأ بإنشاء ملف جديد، مثلاً:
bashtouch myscript.sh
ثم افتح الملف بواسطة المحرر وابدأ بكتابة السكربت.
2.3. السطر الأول: Shebang
يُستخدم سطر الـ Shebang لتحديد أي Shell سيتم استخدامه لتنفيذ السكربت. مثال:
bash#!/bin/bash
هذا السطر يجب أن يكون في بداية الملف، وهو يشير إلى أن السكربت سيتم تنفيذه باستخدام Bash.
3. أساسيات سكربتات Shell
3.1. الأوامر الأساسية
يمكنك استخدام أي أمر من أوامر الطرفية داخل السكربت مثل:
bashecho "مرحبا بالعالم"
ls -l
pwd
3.2. المتغيرات
يمكن تعريف المتغيرات وتخزين القيم فيها لاستخدامها لاحقاً:
bashNAME="محمد"
echo "مرحباً يا $NAME"
لا تضع فراغات حول علامة التساوي = عند تعريف المتغير.
3.3. التعليقات
لإضافة تعليق يستخدم #:
bash# هذا تعليق ولا يتم تنفيذه
echo "هذا سطر تنفيذي"
3.4. قراءة المدخلات من المستخدم
يمكن قراءة مدخلات المستخدم باستخدام الأمر read:
bashecho "أدخل اسمك:"
read USERNAME
echo "مرحباً $USERNAME"
4. التحكم في تدفق السكربت
4.1. الشروط If
يمكن تنفيذ أوامر بناءً على شرط:
bashif [ $AGE -ge 18 ]; then
echo "أنت بالغ"
else
echo "أنت قاصر"
fi
يجب الانتباه إلى الفراغات حول الأقواس [ و].
4.2. الحلقات Loops
4.2.1. حلقة For
تستخدم لتكرار تنفيذ أوامر:
bashfor i in 1 2 3 4 5
do
echo "العدد هو $i"
done
4.2.2. حلقة While
تنفذ طالما الشرط صحيح:
bashCOUNTER=1
while [ $COUNTER -le 5 ]
do
echo "العداد: $COUNTER"
((COUNTER++))
done
5. الدوال Functions
الدوال تسهل إعادة استخدام الشيفرة وتقسيم السكربت لأجزاء منطقية:
bashgreet() {
echo "مرحباً، هذه دالة ترحب بك!"
}
greet
يمكن أيضًا تمرير معاملات إلى الدوال:
bashgreet() {
echo "مرحباً، $1"
}
greet "محمد"
6. التعامل مع الملفات والمجلدات
6.1. التحقق من وجود ملف أو مجلد
bashif [ -f "file.txt" ]; then
echo "الملف موجود"
fi
if [ -d "folder" ]; then
echo "المجلد موجود"
fi
6.2. إنشاء وحذف الملفات والمجلدات
bashtouch newfile.txt # إنشاء ملف جديد
mkdir newfolder # إنشاء مجلد جديد
rm oldfile.txt # حذف ملف
rmdir oldfolder # حذف مجلد فارغ
7. التعامل مع المعطيات Parameters
يمكن تمرير معطيات للسكربت عند التشغيل:
bash./myscript.sh arg1 arg2
داخل السكربت يمكن الوصول إليها عبر:
-
$1المعطى الأول -
$2المعطى الثاني -
$#عدد المعطيات -
$@جميع المعطيات
مثال:
bashecho "المعطى الأول هو $1"
8. استخدام التوجيه Redirection
8.1. إعادة توجيه الإخراج
bashls > filelist.txt # كتابة ناتج الأمر في ملف
8.2. إضافة الإخراج إلى ملف
bashecho "نص جديد" >> filelist.txt
8.3. إعادة توجيه الأخطاء
bashls nonexistingfile 2> error.log
9. استخدام الأنابيب Pipes
تسمح بتمرير مخرجات أمر كمدخل لأمر آخر:
bashps aux | grep bash
10. نصائح عملية لكتابة سكربتات Shell فعالة
-
التحقق من الأخطاء: يمكن استخدام
set -eلجعل السكربت يتوقف عند أي خطأ. -
استخدام التعليقات بشكل جيد: لشرح الأجزاء المعقدة من السكربت.
-
تنسيق الشيفرة: استخدام التراجع (Indentation) لتحسين القراءة.
-
اختبار السكربتات تدريجياً: لا تكتب سكربت كامل دفعة واحدة، بل جرب الأجزاء.
-
تجنب استخدام المسارات المطلقة: إلا عند الضرورة، لتسهيل النقل.
11. مثال عملي كامل على سكربت Shell
bash#!/bin/bash
# سكربت يقوم بعمل نسخة احتياطية لمجلد محدد
SOURCE_DIR=$1
BACKUP_DIR=$2
DATE=$(date +%Y-%m-%d-%H-%M-%S)
if [ ! -d "$SOURCE_DIR" ]; then
echo "مجلد المصدر غير موجود!"
exit 1
fi
if [ ! -d "$BACKUP_DIR" ]; then
echo "إنشاء مجلد النسخ الاحتياطية..."
mkdir -p "$BACKUP_DIR"
fi
BACKUP_NAME="backup-$DATE.tar.gz"
tar -czf "$BACKUP_DIR/$BACKUP_NAME" -C "$SOURCE_DIR" .
if [ $? -eq 0 ]; then
echo "تم إنشاء النسخة الاحتياطية بنجاح: $BACKUP_NAME"
else
echo "فشل في إنشاء النسخة الاحتياطية"
fi
هذا السكربت يأخذ مسارين: مسار المجلد المراد نسخه احتياطياً، ومسار المجلد الذي سيتم تخزين النسخة الاحتياطية فيه، ثم يقوم بضغط المجلد المصدر في ملف أرشيف مضغوط.
12. الأمن والسلامة في سكربتات Shell
عند كتابة سكربتات Shell، من الضروري اتباع بعض قواعد الأمن:
-
تجنب تنفيذ أوامر غير موثوقة داخل السكربت.
-
التحقق من صحة المدخلات التي يتم استقبالها.
-
عدم تشغيل السكربت كـ root إلا عند الضرورة.
-
تحديد صلاحيات الملفات بشكل مناسب لمنع تعديلها من قبل غير المخولين.
13. أدوات مساعدة لتطوير سكربتات Shell
-
ShellCheck: أداة لفحص السكربتات واكتشاف الأخطاء النمطية والأمنية.
-
Bash Debugger: لتتبع تنفيذ السكربت خطوة بخطوة.
14. ملخص المقارنة بين بعض أوامر Shell الأساسية
| الأمر | الوظيفة | مثال الاستخدام |
|---|---|---|
echo |
طباعة نص أو متغير | echo "مرحبا" |
read |
قراءة مدخلات من المستخدم | read USER |
if |
تنفيذ شرط | if [ $x -eq 1 ]; then ... |
for |
حلقة تكرار | for i in 1 2 3; do ... |
while |
حلقة بناء على شرط | while [ $x -lt 5 ]; do ... |
test أو [ ] |
تقييم الشروط | [ -f file.txt ] |
mkdir |
إنشاء مجلد | mkdir newfolder |
rm |
حذف ملفات أو مجلدات | rm file.txt |
tar |
ضغط وفك ضغط ملفات | tar -czf archive.tar.gz dir |
15. الخلاصة
كتابة سكربتات Shell ليست مجرد مهارة برمجية بل هي فن يجمع بين الفهم العميق لنظام التشغيل، قدرة التعامل مع الأوامر النصية، وفهم كيفية أتمتة المهام لتحسين الأداء وتقليل الأخطاء البشرية. من خلال الإلمام بأساسيات كتابة السكربت، التحكم في تدفق التنفيذ، التعامل مع الملفات والمتغيرات، يمكن لأي مستخدم أن يطور سكربتات فعالة وموثوقة.
يجب دائماً ممارسة الكتابة، اختبار السكربتات في بيئات آمنة، والاهتمام بأمن السكربتات وقراءة الأدلة وأفضل الممارسات الحديثة. ستساعد هذه الخطوات على بناء مهارات قوية تؤهل المهتمين لإدارة الأنظمة أو تطوير البرمجيات بشكل أكثر احترافية.
المراجع:
-
Bash Reference Manual – The GNU Project
-
Advanced Bash-Scripting Guide – Mendel Cooper

