السكربت · فصل ٥

تكتب أول shell script

shebang · chmod · arguments · if · for · functions
🎯 الهدف: تحط أوامر في ملف يتنفّذ، ياخد حجة، ويوقف لو المدخل غلط.

ملف عادي، وأول سطر يقول مين يشغّله

السكربت ملف نص. أول سطر shebang يقول النظام يشغّله بأنهي برنامج:

count-dir.sh
#!/usr/bin/env bashecho "أنا سكربت"

env يلاقي bash من PATH، فمش مربوط بمسار جهاز واحد. بعدين:

terminal
chmod +x count-dir.sh./count-dir.sh

./ مهمة. الفولدر الحالي مش في PATH عادة، فـ count-dir.sh لوحده مش هيتلاقى. bash count-dir.sh يشغّله حتى من غير chmod، وبيحترم إنك اخترت bash.

الحجج مش بتتسأل، بتتبعت

$1 أول حجة، $2 التانية. $# العدد. "$@" كل الحجج، كل واحدة كلمة لوحدها. ده غير $* اللي بيلمّهم.

count-dir.sh
#!/usr/bin/env bashdir="${1:?اكتب مسار الفولدر}"if [[ ! -d "$dir" ]]; then  echo "مش لاقي الفولدر: $dir" >&2  exit 1ficount=0for f in "$dir"/*; do  [[ -e "$f" ]] || continue  count=$((count + 1))doneecho "عدد الحاجات: $count"

${1:?رسالة} يوقف السكربت لو الحجة ناقصة، ويطبّع الرسالة على stderr. [[ -d ]] اختبار فولدر. [[ -f ]] ملف. [[ -z "$var" ]] نص فاضي. المسافات جوه [[ ]] مش زينة، الاختبار بيبوظ من غيرها.

exit 1 يطلّع رقم فشل للي شغّلك، عشان && برا السكربت يشتغل صح. رسالة الغلط على stderr (>&2) عشان اللي بيعمل pipe على الناتج ماياخدش التحذير كبيانات.

الحجة بين تنصيص، والغلط على الباب ٢، والخروج برقم مش بصفر.

القرار والتكرار

if / elif / else / fi. for على قائمة. while طول ما الشرط صح. break تخرج من اللوب، continue تكمل الدورة الجاية.

terminal
for dish in كشري سلطة; do  echo "طبق: $dish"done

متلفّش على ناتج ls. لف على النمط "$dir"/* أو استخدم find لو الشجرة عميقة. الاسم اللي فيه مسافة بيضيع لما ls يطبّعه والسكربت يقطّعه تاني.

دالة عشان متكررش

lib.sh
die() {  echo "$1" >&2  exit 1}[[ -n "${1:-}" ]] || die "ناقص حجة"

الدالة بتتشاف في نفس الشيل. $1 جواها حجة الدالة، مش حجة السكربت، إلا لو نديتها. ${1:-} يخلّي الحجة الناقصة نص فاضي بدل ما set -u يوقع السكربت. هنفعّل set -u في الفصل الجاي.

read -r line يقرأ سطر من stdin. -r عشان الشيل مايفسّرش الشرطة المقلوبة. في سكربت، مدخل المستخدم مش دايمًا موجود، فالحجج أوضح من سؤال تفاعلي.

🧪 Lab

احفظ السكربت count-dir.sh اللي فوق، اديه chmod +x، وجرّبه على /tmp وعلى مسار مش موجود وعلى من غير حجة. التلاتة لازم يبانوا مختلفين: رقم، رسالة غلط وخروج بفشل، ورسالة إن الحجة ناقصة.

خلّصت الفصل لما

🧠 اختبر نفسك
١) ليه ./script.sh مش script.sh لوحده؟
الفولدر الحالي مش في PATH، فالشيل مش هيدوّر فيه إلا بالمسار الصريح.
٢) $1 جوه دالة هو إيه؟
أول حجة اتبعت للدالة، مش تلقائيًا أول حجة السكربت.
٣) رسالة الغلط تروح فين؟
stderr، بـ >&2، عشان متتخلّطش مع الناتج اللي ممكن يتوصل بماسورة.