ملف عادي، وأول سطر يقول مين يشغّله
السكربت ملف نص. أول سطر shebang يقول النظام يشغّله بأنهي برنامج:
#!/usr/bin/env bashecho "أنا سكربت"env يلاقي bash من PATH، فمش مربوط بمسار جهاز واحد. بعدين:
chmod +x count-dir.sh./count-dir.sh./ مهمة. الفولدر الحالي مش في PATH عادة، فـ count-dir.sh لوحده مش هيتلاقى. bash count-dir.sh يشغّله حتى من غير chmod، وبيحترم إنك اخترت bash.
الحجج مش بتتسأل، بتتبعت
$1 أول حجة، $2 التانية. $# العدد. "$@" كل الحجج، كل واحدة كلمة لوحدها. ده غير $* اللي بيلمّهم.
#!/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 تكمل الدورة الجاية.
for dish in كشري سلطة; do echo "طبق: $dish"doneمتلفّش على ناتج ls. لف على النمط "$dir"/* أو استخدم find لو الشجرة عميقة. الاسم اللي فيه مسافة بيضيع لما ls يطبّعه والسكربت يقطّعه تاني.
دالة عشان متكررش
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 لوحده؟
٢) $1 جوه دالة هو إيه؟
٣) رسالة الغلط تروح فين؟
>&2، عشان متتخلّطش مع الناتج اللي ممكن يتوصل بماسورة.