AzLearn

النطاق المحلي

Local Scope

مفهوم ~15 دقيقة

النطاق المحلي — Local Scope

في Bash، المتغيرات افتراضياً عامة داخل السكربت. إذا عرّفت name داخل دالة بدون local، فقد تغير متغيراً يحمل الاسم نفسه في مكان آخر. هذا من أكثر أسباب الأخطاء المزعجة، لأن السكربت لا يعطيك تحذيراً واضحاً. الحل العملي: داخل الدوال، استخدم local للمتغيرات المؤقتة.

local title="$1" تعني أن title يعيش داخل الدالة فقط. عندما تنتهي الدالة، لا يؤثر على بقية السكربت. هذا يجعل الدوال أكثر أماناً وقابلية لإعادة الاستخدام. لا تحتاج local للمتغيرات العامة المقصودة مثل إعدادات ثابتة في أعلى الملف، لكن لا تكثر منها.

من الجيد أيضاً أن تمرر القيم إلى الدوال بدلاً من جعلها تقرأ كل شيء من الخارج. الدالة التي تقول format_name "$first" "$last" أوضح من دالة تعتمد على متغيرات عامة اسمها first وlast.

مثال يوضح الفكرة

script.sh

لو حذفنا local، قد تتغير قيمة name الخارجية. هذا النوع من الخطأ يصعب ملاحظته في سكربت طويل.

قاعدة عملية

كل متغير داخل دالة يبدأ غالباً بـlocal. الاستثناءات قليلة ومقصودة. عندما تكتب دالة، فكر فيها كغرفة صغيرة: يدخل إليها ما تحتاجه عبر المعاملات، وتخرج منها نتيجة واضحة أو status واضح.

يمكن الجمع بين local وreadonly باستخدام local -r:

validate_port() {
    local -r port="$1"   # local + readonly: لا يمكن تغييره داخل الدالة
    [[ "$port" =~ ^[0-9]+$ ]] && ((port > 0 && port <= 65535))
}

local -r مفيد للمعاملات التي يجب ألا تتغير داخل الدالة. يعطي خطأً صريحاً إذا حاول الكود تعديله.

تحدي — Challenge