OnWorks Linux و Windows Online WorkStations

الشعار

استضافة مجانية على الإنترنت لمحطات العمل

<السابق | المحتويات | التالي>

IFS

عادةً ما تقوم الصدفة بتقسيم الكلمات على المدخلات المقدمة لـ اقرأ. كما رأينا ، هذا يعني أن الكلمات المتعددة المفصولة بمسافة واحدة أو أكثر تصبح عناصر منفصلة في سطر الإدخال ، ويتم تخصيصها لمتغيرات منفصلة بواسطة اقرأ. يتم تكوين هذا السلوك بواسطة متغير shell المسمى IFS (لفاصل المجال الداخلي). القيمة الافتراضية لـ IFS يحتوي على مسافة وعلامة تبويب وحرف سطر جديد ، كل منها سيفصل العناصر عن بعضها البعض.

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



#! / بن / باش

# read-ifs: اقرأ الحقول من ملف FILE = / etc / passwd

#! / بن / باش

# read-ifs: اقرأ الحقول من ملف FILE = / etc / passwd


read -p "أدخل اسم مستخدم>" user_name file_info = $ (grep "^ $ user_name:" $ FILE) إذا [-n "$ file_info"] ؛ من ثم

IFS = ":" قراءة user pw uid gid name home shell <<< "$ file_info" echo "User = '$ user'"

صدى "UID = '$ uid'"

صدى "GID = '$ gid'" echo "Full Name = '$ name'" echo "Home Dir. = '$ home'" echo "Shell = '$ shell'"

آخر

صدى "لا يوجد مثل هذا المستخدم '$ user_name'"> & 2 خروج 1

fi

read -p "أدخل اسم مستخدم>" user_name file_info = $ (grep "^ $ user_name:" $ FILE) إذا [-n "$ file_info"] ؛ من ثم

IFS = ":" قراءة user pw uid gid name home shell <<< "$ file_info" echo "User = '$ user'"

صدى "UID = '$ uid'"

صدى "GID = '$ gid'" echo "Full Name = '$ name'" echo "Home Dir. = '$ home'" echo "Shell = '$ shell'"

آخر

صدى "لا يوجد مثل هذا المستخدم '$ user_name'"> & 2 خروج 1

fi


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

file_info = $ (grep "^ $ user_name:" $ FILE)

هذا السطر يعين نتائج أ البقرى الأمر إلى المتغير معلومات الملف. التعبير المعتاد المستخدم من قبل البقرى يؤكد أن اسم المستخدم سيتطابق فقط مع سطر واحد في / الخ / باسود ملف.

السطر الثاني المثير للاهتمام هو هذا:

IFS = ":" قراءة user pw uid gid name home shell <<< "$ file_info"

يتكون الخط من ثلاثة أجزاء: تخصيص متغير ، أ اقرأ الأمر مع قائمة بأسماء المتغيرات كوسائط ، وعامل إعادة توجيه جديد وغريب. سننظر في إسناد المتغير أولاً.

يسمح الغلاف بواحد أو أكثر من التعيينات المتغيرة أن تتم مباشرة قبل الأمر. تعمل هذه التخصيصات على تغيير بيئة الأمر التالي. تأثير التخصيص مؤقت ؛ فقط تغيير البيئة طوال مدة الأمر. في حالتنا ، قيمة IFS تم تغييره إلى حرف النقطتين. بالتناوب ، كان بإمكاننا ترميزها بهذه الطريقة:

OLD_IFS = "$ IFS" IFS = ":"

قراءة المستخدم pw uid gid name home shell <<< "$ file_info" IFS = "$ OLD_IFS"

حيث نقوم بتخزين قيمة IFS، قم بتعيين قيمة جديدة ، قم بتنفيذ اقرأ الأمر ، ثم استعادته IFS لقيمته الأصلية. من الواضح ، وضع التخصيص المتغير أمام


الأمر هو طريقة أكثر إيجازًا للقيام بنفس الشيء.

<< يشير عامل التشغيل أ هنا السلسلة. السلسلة هنا تشبه وثيقة هنا ، فقط أقصر وتتكون من سلسلة واحدة. في مثالنا ، سطر البيانات من

يتم تغذية الملف / etc / passwd بالإدخال القياسي لأمر read. قد نفوز-

لماذا تم اختيار هذه الطريقة المائلة بدلاً من:

صدى "$ file_info" | IFS = ":" قراءة المستخدم pw uid gid name home shell

صورة

حسنًا ، هناك سبب ...


لا يمكنك قراءة الأنابيب

وعلى الرغم من أن اقرأ يأخذ الأمر عادةً مدخلات من الإدخال القياسي ، ولا يمكنك القيام بذلك:

صدى "فو" | اقرأ

نتوقع أن ينجح هذا ، لكنه لا ينجح. سوف يبدو الأمر وكأنه ناجح ولكن الرد سيكون المتغير فارغًا دائمًا. لماذا هذا؟

يتعلق التفسير بالطريقة التي يتعامل بها الغلاف مع خطوط الأنابيب. في سحق (وقذائف أخرى مثل sh) ، يتم إنشاء خطوط الأنابيب القذائف الفرعية. هذه نسخ من الغلاف وبيئته المستخدمة لتنفيذ الأمر في خط الأنابيب. في مثالنا أعلاه ، اقرأ يتم تنفيذه في قشرة فرعية.

تقوم المجموعات الفرعية في الأنظمة الشبيهة بـ Unix بإنشاء نسخ من البيئة للعمليات لاستخدامها أثناء تنفيذها. عندما تنتهي العمليات يتم تدمير نسخة البيئة. هذا يعني ذاك لا يمكن للقشرة الفرعية أبدًا أن تغير بيئة عمليتها الأم. اقرأ يعين المتغيرات التي تصبح بعد ذلك جزءًا من البيئة. في المثال أعلاه ، اقرأ يعين القيمة "foo" للمتغير الرد في بيئة المجموعة الفرعية الخاصة به ، ولكن عند خروج الأمر ، يتم تدمير المجموعة الفرعية وبيئتها ، ويتم فقد تأثير المهمة.

يعد استخدام السلاسل هنا إحدى الطرق للتغلب على هذا السلوك. طريقة أخرى تمت مناقشتها في الفصل 36.


أفضل الحوسبة السحابية لنظام التشغيل في OnWorks: