Bash / المتوسط: بيانات ومسارات فشل موثوقة / الدرس 10
قراءة السجلات دون تغييرها خفية
حدد الفواصل والمسافات والشرطات والسجل الأخير وحدود الثنائي قبل read أو mapfile أو محلل آخر.
في هذه الصفحة
أهداف الدرس
- استخدام IFS= read -r للسجلات السطرية الحرفية.
- معالجة سطر نهائي غير منته مسموح صراحة.
- تمييز الصيغ المحتاجة محللاً منظماً.
الفاصل جزء من صيغة البيانات
تجعل الصيغة السطرية الجديد فاصلاً ولا يلتزم به كل اسم أو سجل. حدد الترميز والفواصل والفارغ والنهاية. لا يصلح تقسيم CSV متعدد الأسطر بفواصل بسيطة ولا JSON بحيل النص. تناسب Bash التنسيق والنص المعلن وغالباً يكون اختيار محلل آخر أوثق. ارفض غير المدعوم ولا تغير معناه.
حفظ المسافات والشرطات الخلفية عمداً
يقسم read عادة بـ IFS ويفسر الشرطة. تجعل IFS= read -r line القراءة حرفية دون تقليم وتقسيم مع حفظ الشرطة. لا يخزن الفاصل. الاسم وجهة لا صيغة. اجعل read شرط الحلقة لينهي EOF وحدد بيئتها بالتوجيه؛ فقد ينشئ الأنبوب ابناً.
while IFS= read -r line; do
printf '<%s>\n' "$line"
done < <(printf '%s\n' ' red apple ' 'path\name' '')
< red apple >
<path\name>
<>
ينتج المصدر ثلاثة سجلات منتهية ويطبعها دون تقليم وتكشف الأقواس الحدود.
تحديد صلاحية سجل أخير غير منته
يعيد read غير صفر عند EOF ولو أسند بقايا غير منتهية فتفوت الحلقة البسيطة. إذا سمح العقد عالج غير الفارغ بشرط || [[ -n $line ]]، دون اختراع فارغ إضافي. إذا لزم الفاصل فارفض التشوه. اختبر الفارغ المنتهي والبقية غير المنتهية.
count=0
while IFS= read -r line || [[ -n $line ]]; do
count=$((count + 1))
printf '%s:<%s>\n' "$count" "$line"
done < <(printf 'first\nlast')
1:<first>
2:<last>
لا ينتهي الثاني بجديد ويقبله الشرط مرة ولا ينشئ EOF ثالثاً.
تحتاج تدفقات NUL نموذج تخزين أيضاً
يحفظ NUL حدود أسماء قد تحوي أسطراً لأن مكونات المسار لا تحويه. يدعم read -d الفارغ الوقف عنده بخطنا وتوجد خيارات mapfile حسب الإصدار. لكن المتغير لا يحفظ NUL داخلياً. استهلك حمولة في كل مرة لا تدفقاً ثنائياً كاملاً بالاستبدال. لا تدع أمان كل الثنائي وأكد الدعم وحالة المنتج.
اختيار التدفق أو الجمع المحدود
يسهل mapfile جمع السجلات مقابل الذاكرة، وتحد الحلقة التدفقية الذاكرة ويصح المحلل المخصص للأعقد. حدد الفارغ والمكرر قبل الإسناد. لا تصدر ملفاً لتجنب المحلل فهذا تنفيذ. افصل خطأ التحليل من EOF والناقص من الفارغ الكامل. اختبر التشوه والمسافات والحجم الصحيح بحدود محلية آمنة.
الأخطاء الشائعة وإصلاحها
اختفاء الشرطات أو المسافات الطرفية
- لماذا يحدث؟
- استخدم read تفسيره الافتراضي.
- كيف تصلحه؟
- استخدم IFS= و-r للحرفي.
- كيف تتجنب تكراره؟
- اختبر سجلات المسافة والشرطة.
تجاوز السطر الأخير غير الفارغ
- لماذا يحدث؟
- أنهت الحالة الحلقة قبل البقية المسموحة.
- كيف تصلحه؟
- عالج البقية وفق العقد.
- كيف تتجنب تكراره؟
- اختبر غياب الفاصل الأخير.
إفساد CSV مقتبس بتقسيم الفواصل
- لماذا يحدث؟
- عوملت قواعد منظمة حقولاً بسيطة.
- كيف تصلحه؟
- استخدم محللاً للصيغة.
- كيف تتجنب تكراره؟
- أعلن الصيغ وارفض غير المدعوم.
اختبر فهمك
1. لماذا تفوت while read أحرفاً أسندتها عند EOF؟
اعرض الحل المشروح
لا يعمل الجسم إلا بنجاح الشرط وEOF غير صفري رغم البقية. أضف معالجتها إن سمحت الصيغة وإلا شخّص الفاصل الغائب.
2. هل تلتقط Bash قائمة NUL كاملة بمفرد؟
اعرض الحل المشروح
لا تحفظ المتغيرات NUL. عالج الحمولات المفردة أو أداة ثنائية واحفظ الحدود وحالة المنتج.
أهم ما تعلمته
- عرف السجلات قبل خيارات read.
- افصل EOF والتشوه وفشل الإنتاج.