كيفية استخدام أمر read في نظام لينكس

read-command-feature-image

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

ما هو أمر `read`

في لينكس، يمكنك استخدام أمر read لالتقاط إدخال المستخدم أو قراءة سطر من المدخلات القياسية (stdin). يقوم هذا الأمر بقراءة عدد البايتات من موصل الملف المحدد وتخزينها في المخزن المؤقت. بعد ذلك، يعيد عدد البايتات التي تم قراءتها، صفر، أو خطأ.

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

خيارات أمر `read`

أمر read في Bash يحتوي على العديد من الخيارات للتحكم في إدخال المستخدم. بعض الخيارات لا تحتاج إلى معلمات إضافية، بينما يحتاج البعض الآخر.

الخيارات الوصف
-a <array> يخزن الإدخال كمصفوفة بدلاً من متغيرات منفصلة.
-s يعمل بصمت، مما يعني عدم عرض الإدخال على الطرفية.
-e يتيح دعم مكتبة readline، مما يسمح بقراءة السطر.
-i <prefix> يوفر قيمة إدخال أولية تظهر عند المطالبة باستخدام readline.
-p <prompt> يعرض المطالبة المحددة قبل قراءة الإدخال.
-u <file descriptor> يقرأ من موصل ملف محدد بدلاً من المدخلات القياسية (stdin).
-d <delimiter> يتيح لك تحديد فاصل سطر الإدخال بدلاً من حرف السطر الجديد الافتراضي.
-t <time> يحدد فترة المهلة للإدخال؛ إذا لم يتم تلقي الإدخال خلال هذا الوقت، يعيد read فشلًا.
-r عند تحديده، لا يتم التعامل مع الشرطة المائلة كحروف هروب.
-n <number> يقرأ فقط عدد الأحرف المحددة.

كيفية قراءة الإدخال باستخدام أمر `read`

أبسط طريقة لاستخدام أمر read هي استخدامه بدون أي معلمات أو خيارات. عند تنفيذ أمر read بمفرده، سيطلب منك تقديم الإدخال الذي تريد قراءته. بعد تقديم الإدخال، سيخرج ويخزنه في متغيره الافتراضي المسمى REPLY.

read

الآن، بعد تقديم الإدخال، دعنا نعرضه باستخدام أمر echo:

echo $REPLY

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

read variable1

الآن، لعرض النتيجة، تحتاج إلى استخدام أمر echo مع المتغير الذي يخزن قيمتك:

echo $variable1

قراءة قيم متعددة

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

read variable1 variable2 variable3

هنا، تخزن الكلمة الأولى من الجملة في المتغير الأول، والكلمة الثانية في المتغير الثاني، وجميع الكلمات المتبقية في المتغير الأخير المقدم.

دعنا نعرض النتيجة باستخدام الأمر:

echo $variable1 $variable2 $variable3

قراءة من ملف

بينما أمر read مخصص بشكل أساسي للإدخال من المستخدم، يمكنك أيضًا استخدامه لقراءة الأسطر من ملف. للقيام بذلك، استخدم حلقة while، وأمر echo، وأمر read متبوعًا باسم متغير معين:

while read line; do
echo "$line"
done < samplefile.txt

هنا، تقرأ حلقة while كل سطر من “samplefile.txt” وتسجله في المتغير line. بعد قراءة جميع الأسطر من الملف، يعرض أمر echo قيمة السطر.

قراءة الإدخال في حلقة

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

while read line; do
echo "السطر: $line"
done

علاوة على ذلك، تستمر الحلقة حتى تتلقى إشارة نهاية الملف (EOF)، عادةً عن طريق الضغط على Ctrl + D.

كيفية مطالبة الإدخال باستخدام أمر `read`

يمكنك أيضًا إنشاء مطالبات تفاعلية سيتم عرضها قبل إدخال المستخدم. يمكنك تحقيق ذلك باستخدام الخيار -p مع أمر read.

read -p "أدخل اسمك: " name

تحديد طول إدخال المستخدم أثناء القراءة

هل ترغب في التحكم في ما يمكن للمستخدمين إدخاله؟ استخدم الخيار -n مع read لتحديد طول الأحرف المرغوب فيه. على سبيل المثال، إذا كنت تريد التقاط أول 9 أحرف من إدخال المستخدم، استخدم الأمر التالي:

read -n 9 variable

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

فصل الحقول باستخدام IFS

يمكنك استخدام متغير IFS (Internal Field Separator) مع أمر read لتحديد كيفية تقسيم الإدخال إلى حقول منفصلة. بشكل افتراضي، يستخدم IFS الأحرف الفارغة (الجدول، السطر الجديد، والمسافة) كفواصل حقول. ومع ذلك، يمكنك تخصيص IFS لتلبية احتياجاتك.

على سبيل المثال، يمكنك تحديد قيمة النقطتين (:) كفاصل:

IFS=':' read name password

ثم يمكنك عرض النتيجة باستخدام:

echo "اسم المستخدم: $name، كلمة المرور: $password"

تعيين مهلة على أمر `read`

يمكنك أيضًا تكوين مهلة لأمر read باستخدام الخيار -t. هذا مفيد إذا كنت تريد التأكد من أن السكربت لا يعتمد على إدخال المستخدم لفترة طويلة.

لنحدد مهلة قدرها 10 ثوانٍ باستخدام الخيار -t:

read -t 10 -p "أدخل اسمك (مهلة 10 ثوانٍ): " name

إذا لم يكتب المستخدم أي شيء خلال 10 ثوانٍ، يستمر السكربت في التنفيذ.

كيفية إخفاء إدخال المستخدم

في بعض الأحيان، قد ترغب في إخفاء إدخال المستخدم، مثل عند إدخال معلومات حساسة مثل كلمات المرور. يمكنك تحقيق ذلك باستخدام الخيار -s لأمر read:

read -s -p "أدخل كلمة المرور: " password

بعد تخزين كلمة المرور في المتغير المحدد، يمكنك عرضها في الطرفية باستخدام الأمر:

echo -e "\nكلمة المرور: $password"

هنا، يتيح الخيار -e تفسير تسلسل الهروب، و\n يضيف سطرًا جديدًا قبل العرض.