ما يقرأ؟
القراءة هي أمر bash مدمج يقرأ محتويات السطر إلى متغير. يسمح بتقسيم الكلمات المرتبط بمتغير الصدفة الخاص IFS. يتم استخدامه بشكل أساسي لالتقاط مدخلات المستخدم ولكن يمكن استخدامه لتنفيذ الوظائف التي تأخذ المدخلات من المدخلات القياسية.
قراءة Bash تعليمات الأمر المدمج
قبل أن نتعمق في كيفية استخدام الأمر read في نصوص bash ، إليك كيفية الحصول على المساعدة. هناك سترى جميع الخيارات المتاحة لأمر القراءة بالإضافة إلى الأوصاف التي سنحاول تغطيتها في الأمثلة.
سطر الأوامر
يساعد اقرأ
انتاج |
اقرأ:اقرأ [-رس] [- مجموعة] [-d حصة] [-أنا نص] [-n nchars] [-N nchars]
[-p موجه] [-t مهلة] [-u فد] [اسم ...]
اقرأ سطرًا من الإدخال القياسي والانقسامفي الحقول.
يقرأ سطرًا واحدًا من الإدخال القياسي أو منملفواصف FD
لوال-uيتم توفير الخيار. الخطالانقسامفي الحقولكمابكلمة
تقسيم ، ويتم تخصيص الكلمة الأولى لأول اسم ، والثانية
كلمة للاسم الثاني ، وهكذا ، مع أي كلمات متبقية مخصصة لها
الالاخيراسم. تم العثور على الشخصيات فقطفي IFS دولارمعترف بهاكماكلمة
المحددات.
إذا لم يتم توفير أسماء ، الخطاقرأيتم تخزينهفيالمتغير REPLY.
خيارات:
-إلىمجموعة تعيين الكلماتاقرأللمؤشرات المتسلسلة للصفيف
صفيف متغير ، يبدأ من الصفر
-ددليماستمر حتىالحرف الأول من DELIM هواقرأ، على الاصح
من السطر الجديد
- استخدم Readline للحصول على الخطفيقذيفة تفاعلية
-أنااستخدام النص TEXTكماالنص الأوليلقراءة
-ننشارسإرجاعبعد قراءة أحرف NCHARS بدلاً من الانتظار
لسطر جديد ، ولكن احترم المحددلواقل من
أحرف NCHARS هياقرأقبل المحدد
-ننشارسإرجاعفقط بعد قراءة أحرف NCHARS بالضبط ، ما لم يكن
تمت مصادفة EOF أواقرأ مراتالخروج ، وتجاهل أي
محدد
-pموجه إخراج السلسلة PROMPT دون سطر جديد زائدة من قبل
يحاول أناقرأ
-rفعلعدم السماح للشرطة المائلة للخلف بتخطي أي أحرف
-سفعلليسرما - طرد - قذفالمدخلات القادمة من المحطة
-tنفذ الوقتزمنخارجا وإرجاعبالفشللوإلىمكتملخط من
المدخلات ليست كذلكاقرأفي غضون TIMEOUT ثانية. قيمة
متغير TMOUT هو المهلة الافتراضية. قد يكون TIMEOUT
عدد كسري. إذا كانت المهلة0واقرأعائدات
على الفور ، دون محاولةاقرأأي بيانات تعود
النجاح فقطلوالإدخال متاح على المحدد
ملفواصف. الخروجالحالة أكبر من128
لوتم تجاوز المهلة
-uفداقرأمن عندملفواصف FD بدلا من المدخلات القياسية
حالة الخروج:
الإرجاعالرمز هو صفر ، ما لم تتم مصادفة نهاية الملف ،اقرأ مراتخارج
(في أي قضيةهو - هيأكبر من 128) ، خطأ تعيين متغير
اصطياد مدخلات المستخدم
نصوص bash التفاعلية ليست شيئًا بدون اصطياد مدخلات المستخدم. توفر القراءة المضمنة طرقًا يمكن أن يتم اكتشاف إدخالها داخل نص برمجي bash.
اصطياد خط الإدخال
للقبض على سطر من الإدخال NAMEs والخيارات ليست مطلوبة من خلال القراءة. عندما لا يتم تحديد NAME ، يتم استخدام متغير يسمى REPLY لتخزين مدخلات المستخدم.
أوامر
{رما - طرد - قذف -ن 'اكتب شيئًا واضغط على Enter:'؛
اقرأ؛
رما - طرد - قذفأنت كتبته$ {REPLY}
}
انتاج |
اكتب شيئًا واضغط على إدخال: شيء ما(خط جديد)لقد كتبت شيئًا
اصطياد كلمة المدخلات
لالتقاط كلمة من المدخلات ، فإن الخيار -d مطلوب. في حالة وجود كلمة ، نضع -d على مسافة ، اقرأ '-d'. هذا عندما يضغط المستخدم على شريط المسافة ، سيتم تحميل قراءة REPLY بالكلمة.
لاحظ أنه عند تعيين الخيار -d ، لا يعمل مسافة للخلف كما هو متوقع. للخلف ، أثناء محاولة التقاط كلمة إدخال ، يمكن استخدام الخيار -e ، قراءة -e '-d'.
أوامر
رما - طرد - قذف -ن 'اكتب شيئًا واضغط على مسافة'؛
اقرأ '-د '؛
رما - طرد - قذف '؛
رما - طرد - قذف لقد كتبت$ {REPLY}'
}
انتاج |
اكتب شيئًا واضغط على الفضاء: شيء(فضاء)لقد كتبت شيئًا
المستخدم الفوري
في البرامج النصية التفاعلية bash ، قد يطلب المستخدم رسالة لإخبار المستخدم بالإدخال المتوقع. يمكننا دائمًا تحقيق ذلك باستخدام الصدى المدمج. ومع ذلك ، اتضح أن هناك خيارًا باستخدام القراءة.
مطالبة المستخدم بكلمة
عند التقاط كلمة إدخال ، استخدمنا صدى لكتابة شيء ما واضغط على مسافة: إلى الإخراج القياسي قبل قراءة '-d'. يسمح الخيار -p بعرض الرسالة قبل القراءة من الإدخال القياسي.
أوامر
{اقرأ -p 'اكتب شيئًا واضغط على مسافة' '-د '؛
رما - طرد - قذف '؛
رما - طرد - قذف لقد كتبت$ {REPLY}'
}
انتاج |
اكتب شيئًا واضغط على الفضاء: شيء(فضاء)لقد كتبت شيئًا
مطالبة المستخدم بسر
عند التقاط مدخلات المستخدم دون ظهورها في الجهاز الطرفي ، يكون الخيار -s مفيدًا. يسمح لك read -s -p بالتقاط وإخفاء مدخلات المستخدم على النحو التالي.
أوامر
{اقرأ -س -p 'اكتب شيئًا أعدك بإبقائه سراً:'
رما - طرد - قذف '؛
رما - طرد - قذف 'سرك بأمان معى'؛غير محددالرد ؛
رما - طرد - قذف '$ {REPLY}'
}
انتاج |
اكتب شيئًا أعدك بإبقائه سراً:سرك بأمان معى
الوظائف باستخدام read
فيما يلي أمثلة للوظائف في bash التي تستخدم القراءة والإدخال القياسي
المبدأ الأساسي
تستفيد الوظائف التي تستخدم القراءة من المدخلات والمعلمات المعيارية عبر الأنابيب. المدخلات الرئيسية لتكون عملية مثل الخطوط في ملف يتم تمريرها من خلال الإدخال القياسي عبر أنبوب. يتم تمرير أي مدخلات وخيارات أخرى كمعلمات.
اقرأ -t 1NAME1 NAME2 ...اقرأهومدمج أمر
-t 1 يمنع سكربت bash من الانتظار إلى أجل غير مسمى حتى يتم إرجاع سطر من خلال الإدخال القياسي. إذا كان الإدخال القياسي فارغًا في البداية ، فستُرجع الوظيفة برمز خروج 142 يشير إلى عدم قراءة أي تاريخ خلال فترة المهلة المحددة
NAME1 NAME2 هي أسماء متغيرة... قد يتم سرد العديد من أسماء المتغيرات
الآن بعد أن تم تعيين الأعمال الأساسية ، دعنا نرى كيف تبدو الوظائف المألوفة وكأنها تم تنفيذها باستخدام القراءة.
الانضمام إلى وظيفة باستخدام القراءة
لنفترض أننا نريد وظيفة ربط تأخذ قائمة بالكلمات وتعيد قائمة أخرى من الكلمات المرتبطة بمحدد. إليك كيف يمكننا تنفيذ وظيفة الصلة باستخدام read.
النصي#!/bin/bash
## انضم
## الإصدار 0.0.2 - إصلاح معلمات العودية
################################################## #
انضم() { { محليالمحدد.المحدد='{1-} دولار'؛محليمتجاوز.
التفوق='{2-.} دولار'؛}
محليالسيارات
محليمجلس الإنماء والإعمار
محليIFS
IFS='$ {indelimiter}'
اقرأ -t 1سيارة cdr|| إرجاع
اختبار '$ {cdr}' || { رما - طرد - قذف '$ {سيارة}'؛إرجاع؛}
رما - طرد - قذف '$ {سيارة}$ {outdelimiter}$ {cdr}' | {FUNCNAME} دولار '$ {indelimiter}'
'$ {outdelimiter}'
}
################################################## #
## تم إنشاؤه بواسطة create-stub2.sh v0.1.2
## في الأثنين، 17 يونيو 2019 12:24:59 +0900
## ارى
################################################## #
مصدر: انضم
سطر الأوامر
انتاج |
أ بسطر الأوامر
رما - طرد - قذفأ ب| انضم | انضم. |انتاج |
إلى|بوظائف الخريطة باستخدام read
لنفترض أننا نريد وظيفة خريطة تأخذ قائمة وتعيد قائمة أخرى تحتوي على نفس عدد العناصر التي تم تعديلها بواسطة وظيفة أخرى. إليك كيف يمكننا تنفيذ وظيفة الخريطة باستخدام القراءة.
النصي#!/bin/bash
## خريطة
## الإصدار 0.0.1 - الأولي
################################################## #
خريطة() { { محلياسم وظيفة ؛اسم وظيفة='{1} دولار'؛}
محليالسيارات
محليمجلس الإنماء والإعمار
محليIFS
IFS='$ {indelimiter-}'
اقرأ -t 1سيارة cdr|| إرجاع
اختبار '$ (أعلن -f $ {function_name})' || إرجاع
اختبار '$ {سيارة}' || { حقيقية؛إرجاع؛}
$ {function_name} $ {سيارة}
رما - طرد - قذف '$ {cdr}' | {FUNCNAME} دولار '$ {function_name}'
}
################################################## #
## تم إنشاؤه بواسطة create-stub2.sh v0.1.2
## في الثلاثاء، 18 Jun 2019 08:33:49 +0900
## ارى
################################################## #
مصدر: map.sh
أوامر
رما - طرد - قذف {1..10} |خريطة الأسرى
انتاج |
14
9
16
25
36
49
64
81
100
وظيفة التصفية باستخدام read
لنفترض أننا نريد وظيفة مرشح تأخذ قائمة وتعيد قائمة فرعية بالعناصر المشبعة بالشروط التي حددتها وظيفة أخرى. إليك كيف يمكننا تنفيذ وظيفة التصفية باستخدام read.
النصي#!/bin/bash
## منقي
## الإصدار 0.0.1 - الأولي
################################################## #
منقي() { { محلياسم وظيفة ؛اسم وظيفة='{1} دولار'؛}
محليالسيارات
محليمجلس الإنماء والإعمار
محليIFS
IFS='$ {indelimiter-}'
اقرأ -t 1سيارة cdr|| إرجاع
اختبار '$ (أعلن -f $ {function_name})' || إرجاع
اختبار '$ {سيارة}' || { حقيقية؛إرجاع؛}
$ {function_name} '$ {سيارة}' || رما - طرد - قذف -ن '$ {سيارة}'
رما - طرد - قذف '$ {cdr}' | {FUNCNAME} دولار '$ {function_name}'
}
################################################## #
## تم إنشاؤه بواسطة create-stub2.sh v0.1.2
## في الثلاثاء، 18 يونيو 2019 13:19:54 +0900
## ارى
################################################## #
مصدر: مرشح
أوامر
الفردية() { محلي -أنا أنا={1} دولار؛اختبار !$((أنا٪ 2 )) -مكافئ 1؛}رما - طرد - قذف {1..10} |تصفية الفردي
انتاج |
1 3 5 7 9حلقات باستخدام القراءة
الحلقات باستخدام القراءة تسمح لك بالتكرار عبر أسطر الملف الذي سيتم إنشاؤه أو موجود بالفعل.
حلقة أساسية أثناء القراءة للجانب الأيسر (lhs)
لدينا أمر أو وظيفة (lhs) يمكنها إنشاء أسطر في ملف يمكن تكرارها باستخدام حلقة read و while.
بناءlhs| في حين اقرأ
فعل
حقيقية
انتهى
lhs هو ملفأمريقوم بإرجاع قائمة الخطوط
أوامر
فيما يليها 5 | في حين اقرأأنافعل
رما - طرد - قذف $ {i}
انتهى
انتاج |
12
3
4
5
حلقة أساسية أثناء القراءة للجانب الأيمن (rhs)
لدينا ملف (rhs) به أسطر يمكن تكرارها باستخدام read and a while loop.
بناءفي حين اقرأ
فعل
حقيقية
انتهى <rhs
rhs هو ملفملفتحتوي على خطوط
أوامر
فيما يليها 5 >rhsفي حين اقرأأنا
فعل
رما - طرد - قذف $ {i}
انتهى <rhs
انتاج |
1
2
3
4
5
تخصيص lhs while loop باستخدام read
لدينا مجموعة من الكلمات التي نرغب في تكرارها باستخدام القراءة.
بناء(
IFS='
lhs| في حين اقرأ
فعل
حقيقية
انتهى
)
lhs هي قائمة كلمات
أوامر
(IFS='
رما - طرد - قذف {1..5} | في حين اقرأأنا
فعل
رما - طرد - قذف '$ {i}
انتهى
)
انتاج |
1 2 3 4 5القراءة من أي fd بدلاً من الإدخال القياسي
غالبًا ما يُترك خيار القراءة المدمج دون تغيير هو الخيار الذي يسمح لك بتحديد واصف الملف للقراءة منه ، قراءة -u FD. بشكل افتراضي ، يتم اعتبار FD إدخالًا قياسيًا.
المبدأ الأساسي
عند فتح ملف يتم تعيين واصفات الملف. تسمح إعادة توجيه IO في bash بترك الملف مفتوحًا مع واصف ملف معين. يُسمح لنا بالكتابة على الملف والقراءة منه وإغلاقه عند الانتهاء.
_(){
قط /ديف/باطل>ميفيفو.# فارغة myfifo
إكسيك 3<ميفيفو.# فتح ملف myfifo كـ fd 3
رما - طرد - قذف 'مرحبا بالعالم! - من fd 3 ' >ميفيفو.# الكتابة إلى myfifo
اقرأ -u 3؛# قراءة السطر من fd 3
إكسيك 3> &- ؛# إغلاق fd 3
رما - طرد - قذف $ {REPLY} # قراءة سطر الإخراج من fd 3 قبل الإغلاق
}
_# مرحبا بالعالم! من fd 3
بناء قطار مع ملف واصفات وقراءة u FD
للمتعة فقط قررت بناء قطار مع واصفات الملفات وقراءة -u FD. يتم كتابة رقم لكل واصف ملف. يقرأ كل واصف ملف من واصف الملف 1 أدناه ويلحق بنفسه.
سطر الأوامر
سحقlinuxhint.com/يبني/test-read-fd.sh القطار10انتاج |
جارٍ تهيئة fds ...تهيئة fd3...
فد3intialized
تهيئة fd4...
فد4intialized
تهيئة fds
القراءة من فد3و4...
4 3
fds قبل التنظيف
0 1 2 3 4 5
تنظيف ...
تنظيف fds ...
انتهىتنظيف fds
fds بعد التنظيف
0 1 2 3
تخطي وظيفة باستخدام read -u FD
إذا كنت تعمل
وحيد -إلىMINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0.0 تحديث(0.307/5/3)
2017-02-17 14:عشرينx86_64 MSys
سحق --إصدار
جنوسحق، الإصدار 4.4.12(1)-إفراج(x86_64- كمبيوتر- msys)
قد يكون من الممكن بسبب خطأ تنفيذ وظيفة تخطي تتخطى السطر التالي في نص برمجي باش خارج الوظائف قبل قراءة مصدر البرنامج النصي. لاحظ أنه لا يعمل على معظم الأنظمة. على سبيل المثال،
وحيد -إلىلينكس 4.9.0-8-amd64# 1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU / Linux
سحق --إصدار
جنوسحق، الإصدار 4.4.12(1)-إفراج(x86_64- كمبيوتر- لينكس- جنو)
تخطي لا يطير.
وظيفة
يتخطى() { اقرأ -u 31؛}
أوامر
يتخطىرما - طرد - قذفتم تخطي الخط
حقيقية
انتاج |
(فارغة)الحد الأدنى
تقوم القراءة المدمجة في bash بأكثر من مجرد التقاط مدخلات المستخدم. يمكن استخدامه في الوظائف والحلقات والتبادلات بين واصفات الملفات المستخدمة في البرامج النصية bash. في بعض الأحيان ، قد ينتج عن الاستكشاف باستخدام واصفات القراءة والملفات بيض عيد الفصح.