الدليل الشامل لأمر read في برمجيات شل لينكس - من إدخال المستخدم إلى قراءة الملفات سطرًا بسطر مع نصائح عملية

نظرة عامة

يتناول هذا الدليل الاستخدامات الأساسية والمهمة لأمر read الضروري لمعالجة إدخالات المستخدم التفاعلية وتحليل البيانات النصية عند كتابة برمجيات Bash shell في لينكس. ستتمكن من إتقان كل شيء بدءًا من التعامل مع الإدخال الأساسي، وإخفاء كلمات المرور (-s)، وتحديد مهلة الإدخال (-t)، والتقسيم باستخدام المحددات (IFS)، وصولاً إلى معالجة الملفات سطرًا بسطر عبر حلقة while الأكثر استخدامًا في بيئات العمل الحقيقية.

1. أساسيات أمر read، موجه الإدخال (-p) وتعيين القيم الافتراضية

نقوم بتنفيذ الأمر mkdir -p ~/read-demo && cd ~/read-demo لإنشاء مساحة مخصصة للتطبيق العملي لأمر read والانتقال إليها.

mkdir -p ~/read-demo && cd ~/read-demo

يقوم أمر read بقراءة سطر واحد من الإدخال القياسي وتخزينه في متغير، كما يمكن استخدام الخيار -p لطباعة نص توجيهي للمستخدم، واستخدام صيغة ${변수명:-기본값} لتعيين قيمة افتراضية بديلة في حال كان المتغير فارغًا.
في نتيجة التنفيذ، لم يتم تمرير إدخال مباشر إلى أمر read، لذا ظل متغير username فارغًا وتمت طباعة القيمة الافتراضية guest وفقًا لصيغة ${username:-guest}.
⚙️ [الخيارات الرئيسية]

-p : يحدد نص موجه الإدخال (prompt) الذي سيتم عرضه على الشاشة قبل استقبال الإدخال.
-s : يفعل الوضع السري بحيث لا تظهر الأحرف المدخلة على الشاشة، وهو مفيد عند إدخال معلومات حساسة مثل كلمات المرور.
-t : يحدد مهلة انتظار الإدخال بالثواني، حيث يتم إنهاء الإدخال تلقائيًا بعد انقضاء الوقت المحدد.
-n : يستقبل عددًا محددًا فقط من الأحرف وينهي الإدخال فورًا دون الحاجة للضغط على مفتاح Enter.
-r : يقرأ السلسلة النصية كما هي دون تفسير حرف الشرطة المائلة العكسية (\) كحرف هروب (escape character).
-a : يقسم الكلمات المدخلة بناءً على المسافات ويخزنها بالترتيب في متغير مصفوفة.
-d : يحدد رمز فاصل مخصص لإنهاء الإدخال بدلاً من حرف السطر الجديد.

bash -c ‘read -p “사용자 이름을 입력하세요: " username; echo “입력된 사용자: ${username:-guest}” «< “tester”’

2. إخفاء كلمة المرور (-s) وتحديد مهلة الإدخال (-t)

لمتابعة التطبيق العملي، نقوم بالانتقال إلى الدليل ~/read-demo الذي تم إنشاؤه مسبقًا عبر تنفيذ الأمر cd ~/read-demo.

cd ~/read-demo

يتم استقبال الإدخال مع حجب الأحرف على الشاشة باستخدام الخيار -s، وتحديد مهلة زمنية قدرها 5 ثوانٍ باستخدام الخيار -t 5.
تم تمرير كلمة المرور بنجاح خلال المهلة المحددة، وتمت طباعة رمز حالة الخروج ($?) بالقيمة 0.

bash -c ‘read -t 5 -sp “비밀번호를 입력하세요 (5초 제한): " userpass; echo; echo “입력 완료 여부: $?” «< “secret1234”’

3. استخدام المحدد (IFS) والخيار -a لتقسيم المدخلات إلى متغيرات متعددة ومصفوفات

لمتابعة التطبيق العملي، نقوم بالانتقال إلى الدليل ~/read-demo الذي تم إنشاؤه مسبقًا عبر تنفيذ الأمر cd ~/read-demo.

cd ~/read-demo

بعد تعيين محدد الحقول الداخلي (IFS) كفاصلة (,)، يتم قراءة السلسلة النصية بتنسيق CSV الممررة عبر Here-String (<<<) باستخدام أمر read وتخزينها مقسمة في المتغيرات col1 و col2 و col3 على التوالي.
أظهرت نتيجة التنفيذ أنه تم تقسيم اسم الخادم وعنوان IP واسم الخدمة المضمنة في السلسلة النصية وتوزيعها على كل متغير بنجاح بناءً على المحدد المحدد وطباعتها.

bash -c ‘IFS=”,” read -r col1 col2 col3 «< “server01,192.168.1.10,nginx”; echo “서버: $col1 | IP: $col2 | 서비스: $col3”’

يتم ضبط المحدد (IFS) كنقطتين متعامدتين (:) مع استخدام الخيار -a لتقسيم سلسلة نصية بتنسيق /etc/passwd وتخزينها في متغير المصفوفة user_info.
تم استخراج اسم الحساب (root) الموجود في الفهرس رقم 0 ومسار شل تسجيل الدخول (/bin/bash) الموجود في الفهرس رقم 6 من المصفوفة وطباعتهما بنجاح.

bash -c ‘IFS=":" read -ra user_info «< “root:x:0:0:root:/root:/bin/bash”; echo “계정명: ${user_info[0]}, 셸: ${user_info[6]}”’

4. أساسيات العمل الفعلي: معالجة الملفات الضخمة سطرًا بسطر باستخدام حلقة while و read -r

لمتابعة التطبيق العملي، نقوم بالانتقال إلى الدليل ~/read-demo الذي تم إنشاؤه مسبقًا عبر تنفيذ الأمر cd ~/read-demo.

cd ~/read-demo

للتدريب على معالجة الملفات سطرًا بسطر، نقوم بإنشاء ملف CSV نموذجي باسم servers.csv يحتوي على اسم الخادم وحالة التشغيل مفصولين بفاصلة.

echo -e “server-web,running\nserver-db,stopped\nserver-cache,running” > servers.csv

نستخدم حلقة while مع أمر read -r ونحدد محدد الحقول الداخلي (IFS) كفاصلة (,) لقراءة كل سطر من ملف servers.csv بأمان ودون أخطاء.
أظهرت نتيجة التنفيذ أنه تم تعيين اسم كل خادم وحالته المسجلين في الملف إلى المتغيرين name و status بنجاح، وتمت طباعتهما وفقًا للتنسيق المحدد.

while IFS="," read -r name status; do echo “[상태 점검] $name 서버는 현재 $status 상태입니다.”; done < servers.csv

لقد استعرضنا بإيجاز الاستخدامات الأساسية لأمر read في برمجيات شل لينكس، بدءًا من الاستخدام البسيط وصولاً إلى تقنيات قراءة الملفات سطرًا بسطر الشائعة في بيئات العمل الحقيقية.
نأمل أن تستفيد من الخيارات والأمثلة المتنوعة التي تم توضيحها اليوم لكتابة برمجيات أتمتة تفاعلية مخصصة تناسب احتياجاتك.