قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  البرامج/ حجج باش. وظائف Bash في البرامج النصية

حجج باش. وظائف Bash في البرامج النصية

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

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

$ ./myscript 10 20
في هذا المثال ، يتم تمرير النص البرمجي معاملين - "10" و "20". كل هذا جيد وجيد ، لكن كيف تقرأ البيانات الموجودة في النص؟

قراءة معلمات سطر الأوامر

تعيّن قذيفة bash معلمات سطر الأوامر التي يتم إدخالها عند استدعاء البرنامج النصي إلى متغيرات خاصة تسمى المعلمات الموضعية:
  • $ 0 هو اسم البرنامج النصي.
  • $ 1 هي المعلمة الأولى.
  • $ 2 هو المعامل الثاني - وهكذا ، حتى المتغير $ 9 ، الذي يحتوي على المعامل التاسع.
إليك كيفية استخدام معلمات سطر الأوامر في برنامج نصي باستخدام هذه المتغيرات:

#! / bin / bash echo $ 0 echo $ 1 echo $ 2 echo $ 3
لنقم بتشغيل البرنامج النصي باستخدام المعلمات:

./myscript 5 10 15
هذا هو ما ستخرجه إلى وحدة التحكم.


عرض المعلمات التي يتم تشغيل البرنامج النصي بها

لاحظ أن معلمات سطر الأوامر مفصولة بمسافات.

دعنا نلقي نظرة على مثال آخر لاستخدام المعلمات. هنا سنجد مجموع الأرقام التي تم تمريرها إلى البرنامج النصي:

#! / bin / bash total = $ [$ 1 + $ 2] صدى المعلمة الأولى هي $ 1. صدى المعلمة الثانية هي 2 دولار. صدى المبلغ الإجمالي دولار.
لنقم بتشغيل البرنامج النصي ونتحقق من نتيجة الحساب.


برنامج نصي يعثر على مجموع الأرقام التي تم تمريرها إليه

لا يجب أن تكون معلمات سطر الأوامر أرقامًا. يمكنك أيضًا تمرير السلاسل إلى البرامج النصية. على سبيل المثال ، إليك نص برمجي يعمل مع سلسلة:

#! / bin / bash echo مرحبًا $ 1 ، كيف حالك
لنقم بتشغيله:

./myscript آدم
سيخرج ما نتوقعه منه.


البرنامج النصي الذي يعمل مع معلمة سلسلة

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

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

فحص المعلمة

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

#! / bin / bash إذا [-n "$ 1"] ثم صدى مرحبًا $ 1. آخر صدى "لم يتم العثور على معلمات." fi
دعنا نسمي البرنامج النصي أولاً بمعامل ، ثم بدون معلمات.


استدعاء برنامج نصي يتحقق من معلمات سطر الأوامر

عد المعلمات

في البرنامج النصي ، يمكنك حساب عدد المعلمات التي تم تمريرها إليه. يوفر غلاف bash متغيرًا خاصًا لهذا الغرض. وبالتحديد ، يحتوي المتغير $ # على عدد المعلمات التي تم تمريرها إلى البرنامج النصي عند استدعائه.

لنجربها:

#! / bin / bash echo تم تمرير # معلمة.
دعنا نسمي البرنامج النصي.

./myscript 1 2 3 4 5
نتيجة لذلك ، سيبلغ النص البرمجي عن تمرير 5 معلمات إليه.


حساب عدد المعلمات في البرنامج النصي

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

#! / bin / bash echo المعلمة الأخيرة كانت $ (! #)
دعنا نسمي البرنامج النصي ونرى ما يخرجه.


بالإشارة إلى المعلمة الأخيرة

التقاط جميع خيارات سطر الأوامر

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

يحتوي المتغير $ * على جميع المعلمات التي تم إدخالها في سطر الأوامر ككلمة واحدة.

في متغير [بريد إلكتروني محمي]يتم تقسيم المعلمات إلى "كلمات" منفصلة. يمكن تكرار هذه المعلمات في حلقات.

دعونا نرى الفرق بين هذه المتغيرات مع الأمثلة. دعنا نلقي نظرة على محتوياتها أولاً:

#! / bin / bash echo "استخدام الأسلوب \ $ *: $ *" echo "-----------" echo "باستخدام \ [بريد إلكتروني محمي]طريقة: [بريد إلكتروني محمي]"
هنا هو إخراج البرنامج النصي.


المتغيرات $ * و [بريد إلكتروني محمي]

كما ترى ، ناتج كلا المتغيرين هو نفسه. لنحاول الآن استعراض محتويات هذه المتغيرات في حلقات لمعرفة الفرق بينها:

#! / bin / bash count = 1 للمعلمة في "$ *" do echo "\ $ * Parameter # $ count = $ param" count = $ (($ count + 1)) تم العد = 1 للمعلمة في " [بريد إلكتروني محمي]"هل صدى" \ [بريد إلكتروني محمي]تم إنجاز المعلمة # $ count = $ param "count = $ (($ count + 1))
ألق نظرة على ما يخرجه البرنامج النصي إلى وحدة التحكم. الفرق بين المتغيرات واضح جدا.


تحليل $ * و [بريد إلكتروني محمي]في حلقة

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

أمر التحول

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

عند استخدام هذا الأمر ، فإنه يغير قيم المعلمات الموضعية إلى اليسار افتراضيًا. على سبيل المثال ، تصبح قيمة المتغير $ 3 هي قيمة المتغير $ 2 ، وقيمة $ 2 تصبح $ 1 ، ويتم فقدان ما كان سابقًا في $ 1. لاحظ أن هذا لا يغير قيمة المتغير $ 0 الذي يحتوي على اسم البرنامج النصي.

باستخدام الأمر shift ، لنلقِ نظرة على طريقة أخرى للتكرار عبر المعلمات التي تم تمريرها إلى البرنامج النصي:

#! / bin / bash count = 1 بينما [-n "$ 1"] نفذ صدى "Parameter # $ count = $ 1" count = $ (($ count + 1)) التحول تم
يستخدم البرنامج النصي حلقة while ، للتحقق من طول قيمة المعلمة الأولى. عندما يصبح الطول صفرا ، يتم الخروج من الحلقة. بعد التحقق من المعلمة الأولى وعرضها على الشاشة ، يتم استدعاء الأمر shift ، والذي يغير قيم المعلمات بموضع واحد.


استخدام الأمر shift للتكرار عبر المعلمات

عند استخدام الأمر shift ، تذكر أنه في كل مرة تقوم باستدعائها ، تُفقد قيمة المتغير $ 1 بشكل غير قابل للاسترداد.

مفاتيح سطر الأوامر

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

#! / bin / bash echo أثناء [-n "$ 1"] فعل الحالة "$ 1" in -a) صدى "Found the -a option" ؛؛ -b) صدى "Found the -b option" ؛؛ -c) صدى "Found the -c option" ؛؛ *) صدى "$ 1 ليس خيارًا" ؛؛ تحول esac القيام به
لنقم بتشغيل البرنامج النصي:

$ ./myscript –a –b –c –d
ودعنا نحلل ما يعرضه في المحطة.


التعامل مع المفتاح في النص

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

كيفية التمييز بين المفاتيح والمعلمات

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

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

#! / bin / bash بينما [-n "$ 1"] فعل الحالة "$ 1" في -a) صدى "Found the -a option" ؛؛ -b) صدى "Found the -b option" ؛؛ -c) صدى "Found the -c option" ؛؛ -) استراحة التحول ؛؛ *) صدى "$ 1 ليس خيارًا" ؛؛ تحويل esac تم العد = 1 للبارام في [بريد إلكتروني محمي]نفذ صدى "Parameter # $ count: $ param" count = $ (($ count + 1)) تم إنجازه
يستخدم هذا البرنامج النصي الأمر break لمقاطعة حلقة while إذا واجهت شرطة مزدوجة على السطر.

هذا ما تحصل عليه بعد الاتصال به.


التعامل مع مفاتيح سطر الأوامر والمعلمات

كما ترى ، عندما يجد البرنامج النصي ، بتحليل البيانات التي تم تمريرها إليه ، شرطة مزدوجة ، فإنه ينتهي من معالجة المفاتيح ويعتبر كل ما لم تتم معالجته كمعلمات بعد.

التعامل مع المفاتيح بالقيم

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

./myscript -a test1 -b -c test2
يجب أن يكون البرنامج النصي قادرًا على تحديد وقت استخدام معلمات إضافية مع مفاتيح تبديل سطر الأوامر:

#! / bin / bash بينما [-n "$ 1"] فعل الحالة "$ 1" في -a) صدى "Found the -a option" ؛؛ -b) param = "$ 2" echo "تم العثور على الخيار -b ، بقيمة المعلمة $ param" shift ؛؛ -c) صدى "Found the -c option" ؛؛ -) استراحة التحول ؛؛ *) صدى "$ 1 ليس خيارًا" ؛؛ تحويل esac الذي تم العد = 1 للمعلمة في " [بريد إلكتروني محمي]تم تنفيذ "do echo" Parameter # $ count: $ param "count = $ (($ count + 1))
دعنا نسمي هذا البرنامج النصي مثل هذا:

./myscript -a -b test1 -d
دعونا نلقي نظرة على نتائج عمله.


التعامل مع المعلمات الرئيسية

في هذا المثال ، تتم معالجة ثلاثة مفاتيح في بناء الحالة. يتطلب رمز التبديل -b معلمة إضافية. نظرًا لأن المفتاح الذي تتم معالجته موجود في المتغير $ 1 ، فستكون المعلمة المقابلة في $ 2 (يتم استخدام أمر shift هنا ، لذلك ، مع استمرار المعالجة ، يتم نقل كل شيء يتم تمريره إلى البرنامج النصي إلى اليسار). عندما توصلنا إلى هذا ، يبقى فقط استخراج قيمة المتغير $ 2 وسيكون لدينا معلمة المفتاح المطلوب. بالطبع ، هناك حاجة إلى أمر shift آخر هنا حتى يصل المفتاح التالي إلى 1 دولار.

استخدام المفاتيح القياسية

عند كتابة نصوص bash ، يمكنك اختيار أي أحرف لمفاتيح سطر الأوامر وتعيين رد فعل البرنامج النصي على هذه المفاتيح بشكل تعسفي. ومع ذلك ، في عالم Linux ، أصبحت بعض القيم الأساسية شيئًا من المعايير التي من المفيد الالتزام بها. فيما يلي قائمة بهذه المفاتيح:
-a عرض جميع الكائنات.
-ج أداء العد.
-d تحديد الدليل.
-e قم بتوسيع الكائن.
-f حدد الملف الذي تريد قراءة البيانات منه.
-h عرض تعليمات للأمر.
-أتجاهل الحالة.
-l أداء إخراج التنسيق الكامل.
-n استخدم الوضع غير التفاعلي (الدفعي).
-o يسمح لك بتحديد الملف الذي تريد إعادة توجيه الإخراج إليه.
-q تشغيل البرنامج النصي في الوضع الصامت.
-r معالجة المجلدات والملفات بشكل متكرر.
-s تنفيذ البرنامج النصي في الوضع الصامت.
-v تنفيذ الإخراج المطول.
-x استبعاد الكائن.
-y أجب بنعم على جميع الأسئلة.

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

استقبال البيانات من المستخدم

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

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

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

#! / bin / bash echo -n "أدخل اسمك:" اقرأ الاسم صدى "Hello $ name ، مرحبًا بك في برنامجي."
لاحظ أنه يتم استدعاء أمر echo ، الذي يعرض الموجه ، باستخدام المفتاح -n. ينتج عن هذا عدم عرض تغذية سطر في نهاية الموجه ، مما يسمح لمستخدم البرنامج النصي بإدخال البيانات حيث تظهر المطالبة بدلاً من السطر التالي.


التعامل مع مدخلات المستخدم

يمكن تحديد عدة متغيرات عند استدعاء القراءة:

#! / bin / bash read -p "أدخل اسمك:" first last echo "بياناتك لـ $ last، $ first ..."
هذا ما سيخرجه البرنامج النصي بعد الإطلاق.


عدة متغيرات في أمر القراءة

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

#! / bin / bash read -p "أدخل اسمك:" echo مرحبًا $ REPLY ، مرحبًا بك في برنامجي.


استخدام متغير البيئة REPLY

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

#! / bin / bash if read -t 5 -p "أدخل اسمك:" name ثم صدى "Hello $ name ، مرحبًا بك في البرنامج النصي الخاص بي" وإلا صدى "آسف ، بطيء جدًا!" fi
إذا لم يتم إدخال البيانات في غضون 5 ثوانٍ ، فسيقوم البرنامج النصي بتنفيذ فرع عبارة else الشرطية ، مما ينتج عنه اعتذار.


المهلة الزمنية لإدخال البيانات

إدخال كلمات المرور

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

#! / bin / bash read -s -p "أدخل كلمة المرور الخاصة بك:" pass echo "هل كلمة المرور الخاصة بك هي بالفعل $ pass؟"
هذه هي الطريقة التي سيعمل بها هذا البرنامج النصي.


إدخال البيانات السرية

قراءة البيانات من ملف

يمكن لأمر القراءة ، في كل استدعاء ، قراءة سطر واحد من النص من ملف. عندما لا يكون هناك المزيد من الأسطر غير المقروءة في الملف ، فسيتوقف ببساطة. إذا كنت بحاجة إلى الحصول على محتويات الملف بالكامل في نص برمجي ، فيمكنك ، باستخدام خط أنابيب ، نقل نتائج استدعاء الأمر cat للملف ، والبناء while ، الذي يحتوي على الأمر read (بالطبع ، باستخدام cat يبدو الأمر بدائيًا ، لكن هدفنا هو إظهار كل شيء ببساطة قدر الإمكان ، مع التركيز على المبتدئين ؛ سيفهم المستخدمون المتمرسون هذا بالتأكيد).

لنكتب نصًا يستخدم طريقة قراءة الملفات الموضحة للتو.

#! / bin / bash count = 1 cat myfile | أثناء قراءة السطر ، نفذ صدى "Line $ count: $ line" count = $ (($ count + 1)) تم صدى "انتهى"
دعونا نلقي نظرة عليها في العمل.


قراءة البيانات من ملف

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

النتائج

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

في المرة القادمة ، لنتحدث عن عمليات الإدخال والإخراج.

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

ربما يعلم الجميع أن غلاف Bash يحتوي على أوامر مضمنة ليست في مجلدات / bin أو / usr / bin. وهي مدمجة في الغلاف وتعمل كوظائف. في مقال سابق ، نظرنا في. ناقشنا كل شيء تقريبًا هناك ، كيف يجب أن تبدو البرامج النصية ، استخدام الشروط ، الحلقات ، المتغيرات ، لكننا لم نتوقف عند الوظائف.

في مقال اليوم ، سنصلح هذا الخلل. كما هو الحال مع أي لغة برمجة ، فإن Bash لديها وظائف يمكن أن تكون مفيدة جدًا في الاستخدام. سننظر في استخدام وظائف bash ، وكيفية كتابتها ، وحتى كيفية إنشاء مكتبات من هذه الوظائف.

أولاً ، تحتاج إلى فهم ماهية الوظيفة في سياقنا. الوظيفة عبارة عن مجموعة من الأوامر ، موحّدة باسم واحد ، تؤدي مهمة محددة. تسمى الوظيفة باسمها ، ويمكن أن تأخذ المعلمات وتعيد نتيجة عملها. باختصار ، تعمل وظائف Bash تمامًا كما تفعل في لغات البرمجة الأخرى.

بناء الجملة الخاص بإنشاء دالة بسيط للغاية:

function_name () (command_list)

يجب ألا يتطابق اسم الوظيفة مع أي من الأوامر أو الوظائف الموجودة ، ويتم كتابة جميع الأوامر في نص الوظيفة في سطر جديد.

وظيفة بسيطة

لنكتب دالة صغيرة تطبع سلسلة على الشاشة:

الدالة $ vi.sh

#! / بن / باش
printstr () (
صدى "مرحبا العالم"
}
printstr

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

chmod u + x function.sh

كل شيء يعمل ، الآن دعونا نعقد المهمة ، دعونا نحاول تمرير الحجج إلى الوظيفة.

الحجج الوظيفية

يجب تمرير وسيطات الوظيفة عند استدعائها ، ويتم قراءتها بنفس طريقة قراءة وسيطات البرنامج النصي. صيغة استدعاء دالة ذات معلمات bash هي:

اسم وظيفة arg1 arg2 ... argN

كما ترى ، كل شيء بسيط للغاية. المعلمات مفصولة بمسافة. الآن دعنا نحسن وظيفتنا لإخراج السلسلة التي حددناها:

! / بن / باش
printstr () (
صدى 1 دولار
}
printstr "Hello world"

يمكنك عمل عدة معاملات:

! / بن / باش
printstr () (
صدى 1 دولار
صدى دولار 2
صدى 3 دولارات
صدى 5 دولارات
}
printstr "arg1" "arg2" "arg3" "arg4" "arg5"

هناك طريقة أخرى لملء المتغيرات ، كما في C ، باستخدام المكدس. نخرج الوسيطة الأولى ، ثم نغير مؤشر كومة الوسيطات بواحد ، ونخرج الوسيطة الأولى مرة أخرى. إلخ:

! / بن / باش
printstr () (
صدى 1 دولار
تحول
صدى 1 دولار
تحول
صدى 1 دولار
تحول
صدى 1 دولار
}
printstr "arg1" "arg2" "arg3" "arg4"

إرجاع نتيجة دالة

لا يمكنك استخدام الوظائف مع معلمات bash فحسب ، بل يمكنك أيضًا الحصول على نتيجة عملها. للقيام بذلك ، استخدم الأمر return. يقوم بإنهاء الوظيفة وإرجاع القيمة الرقمية لرمز الإرجاع. يمكن أن يكون من 0 إلى 255:

! / بن / باش
printstr () (
عودة 134
}
printstr
صدى $؟

إذا كنت بحاجة إلى تطبيق قيمة إرجاع دالة bash بدلاً من رمز الحالة ، فاستخدم echo. لا يتم إخراج السلسلة مباشرة إلى المحطة ، ولكن يتم إرجاعها كنتيجة للدالة ويمكن كتابتها إلى متغير ثم استخدامها:

! / بن / باش
printstr () (
صدى "اختبار"
}
VAR = $ (printstr)
صدى $ VAR

وظائف التصدير

يمكنك إتاحة وظيفة خارج البرنامج النصي باستخدام أمر التصريح:

! / بن / باش
printstr () (
صدى "مرحبا العالم"
}
تعلن -x -f printstr

ثم قم بتشغيل البرنامج النصي باستخدام الأمر المصدر:

وظيفة المصدر
$ printstr

العودية

يمكنك استدعاء دالة من داخلها للقيام بالعودية:

! / بن / باش
printstr () (
صدى "مرحبا العالم"
printstr
}
printstr

يمكنك تجربة العودية ، يمكن أن تكون مفيدة في كثير من الحالات ، فقط تذكر إجراء أول استدعاء لوظيفة Bash.

المتغيرات المحلية في دالة

إذا قمت بتعريف متغير عادي في دالة ، فسيكون متاحًا في جميع أنحاء البرنامج النصي ، وهذا مناسب لإرجاع قيمة الوظيفة ، ولكن في بعض الأحيان قد تحتاج إلى إنشاء متغير محلي. يوجد أمر محلي لهذا:

! / بن / باش
printstr () (
VAR المحلي = 1 دولار
صدى $ (VAR)
}
printstr "Hello World"

مكتبات الوظائف

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

test1 () (
صدى "مرحبا العالم من 1" ؛
}
test2 () (
صدى "مرحبا العالم من 2" ؛
}
test3 () (
صدى "مرحبا العالم من 3" ؛
}

لنقم الآن بإنشاء برنامج نصي يستخدم وظائفنا. يمكنك استيراد المكتبة باستخدام الأمر المصدر أو ببساطة عن طريق تحديد اسم البرنامج النصي:

! / بن / باش
مصدر lib.sh
اختبار 1
اختبار 2
اختبار 3

الاستنتاجات

في هذه المقالة ، نظرنا في وظائف bash ، وكيفية كتابتها واستخدامها وتجميعها في مكتبات. إذا كنت تكتب غالبًا نصوصًا بلغة Bash ، فستكون هذه المعلومات مفيدة لك. يمكنك إنشاء مجموعة الوظائف الخاصة بك لاستخدامها في كل برنامج نصي وبالتالي تسهيل عملك.

لقد قمت بإنشاء برنامج نصي باستخدام سحر getopt القياسي ، لذا يمكنك استدعاء البرنامج النصي باستخدام

باتمان ربط c ffki

كيف أقوم بإضافة معلمة لاستدعاء هذا البرنامج النصي بمعامل واحد فقط بدون شرطة؟

باتمان ربط ffki

لذلك سوف يفسر هذا الخيار الفردي باعتباره الوسيطة الثانية لـ -c؟

وبحسب هذا الجواب حاولت:

لو [ [بريد إلكتروني محمي]= "ffki"] ؛ ثم اضبط - "-c [بريد إلكتروني محمي]"fi

لكن هذا يؤدي إلى خطأ ، على ما أعتقد ، لأن هذا السطر في البرنامج النصي الخاص بي سيغيره:

# قم بتنفيذ getopt على الوسائط التي تم تمريرها إلى هذا البرنامج ، والتي تم تحديدها بالحرف الخاص [بريد إلكتروني محمي] PARSED_OPTIONS = $ (getopt -n "$ 0" -o hsrvVi: c: --long "تعليمات ، بدء ، إعادة تشغيل ، إيقاف ، مطوّل ، vv ، إصدار ، واجهة: ، مجتمع:" - " [بريد إلكتروني محمي]")

لا أحب إعادة تثبيت البرنامج النصي بالكامل ، فهل هناك سطر واحد بسيط لتعيين الوسيط الأول على "-c" والثاني على "ffki"؟

4 حلول تجمع نموذج الويب من أجل "تغيير وسيطات bash إذا تم تقديم وسيطة واحدة فقط"

يمكنك فعل شيء مثل

إذا [$ # = 1] ؛ ثم # افعل ما تفعله عندما تكون هناك حجة واحدة فقط # قم بعمل getopt bits fi # افعل ما تفعله في كلتا الحالتين

إذا كان -c هو المفتاح الوحيد الذي تريد دعمه ، فلن تحتاج إلى getopt ويمكنك القيام بشيء كهذا بدلاً من ذلك:

#! / bin / bash Usage () (صدى "Usage: $ 0 [-c] arg"> & 2 exit 1) if [$ # = 2]؛ ثم إذا [$ 1 = "-c"]؛ ثم انقل c_switch_value = "$ 1" else use fi elif [$ # = 1]؛ ثم c_switch_value = "$ 1" else use fi

ومع ذلك ، فإن ما إذا كان هذا أكثر قابلية للقراءة أم لا.

إذا [$ # = 1] ؛ ثم # إذا كانت هناك وسيطة واحدة فقط ، فاستبدل العملية الحالية بالاستدعاء الجديد للنص # الخيار الوحيد سيستخدم كـ -c option exec "$ 0" -c " [بريد إلكتروني محمي]"fi

هذا لا يجيب على السؤال الأصلي ، ولكنه حل بديل يعمل في حالتي الخاصة.

يتم توسيع الأمر الموجود في جملة if إلى [متبوعًا بقائمة من امتدادات استبدال الكلمات التي تشكل معلمات موضعية للمتابعة بالكلمات = ffki]. بشكل عام ، لا تعني VAR $ "قيمة VAR" عندما تكون خارج علامات الاقتباس المزدوجة ، بل تعني "تقسيم قيمة VAR إلى كلمات منفصلة وتفسيرها على أنها كرات أرضية." انظر لماذا يختنق برنامج شيلتي النصي بسبب المسافات أو الأحرف الخاصة الأخرى؟

بجانب، " [بريد إلكتروني محمي]"هي حالة خاصة: يتم توسيعها إلى قائمة معلمات الموضع (لا مزيد من التوسيع) ، وليس كلمة واحدة (على الرغم من علامات الاقتباس). يمكنك استخدام" $ * "، التي تتوسع إلى كلمة واحدة من المعلمات الموضعية ، مفصولة بـ مسافة (بتعبير أدق ، الحرف الأول من قيمة IFS) لذا للتحقق مما إذا كان هناك معلمة موضعية واحدة قيمتها ffki ، يمكنك استخدام

إذا ["$ *" = "ffki"] ؛ من ثم

إذا [$ # -eq 1] && ["$ 1" = "ffki"]؛ من ثم

لتغيير معلمات تحديد الموضع التي كنت قريبًا منها: استخدم المجموعة المضمنة وقم بتمرير المجموعة الجديدة من المعلمات الموضعية كوسائط منفصلة. إذا كان هناك خطر أن يبدأ المعامل الأول بـ - ، استخدم set - ... حتى لا يتم تفسيره كخيار.

إذا ["$ *" = "ffki"] ؛ ثم قم بتعيين - -c "ffki" fi

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

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

$ ./myscript 10 20
في هذا المثال ، يتم تمرير النص البرمجي معاملين - "10" و "20". كل هذا جيد وجيد ، لكن كيف تقرأ البيانات الموجودة في النص؟

قراءة معلمات سطر الأوامر

تعيّن قذيفة bash معلمات سطر الأوامر التي يتم إدخالها عند استدعاء البرنامج النصي إلى متغيرات خاصة تسمى المعلمات الموضعية:
  • $ 0 هو اسم البرنامج النصي.
  • $ 1 هي المعلمة الأولى.
  • $ 2 هو المعامل الثاني - وهكذا ، حتى المتغير $ 9 ، الذي يحتوي على المعامل التاسع.
إليك كيفية استخدام معلمات سطر الأوامر في برنامج نصي باستخدام هذه المتغيرات:

#! / bin / bash echo $ 0 echo $ 1 echo $ 2 echo $ 3
لنقم بتشغيل البرنامج النصي باستخدام المعلمات:

./myscript 5 10 15
هذا هو ما ستخرجه إلى وحدة التحكم.


عرض المعلمات التي يتم تشغيل البرنامج النصي بها

لاحظ أن معلمات سطر الأوامر مفصولة بمسافات.

دعنا نلقي نظرة على مثال آخر لاستخدام المعلمات. هنا سنجد مجموع الأرقام التي تم تمريرها إلى البرنامج النصي:

#! / bin / bash total = $ [$ 1 + $ 2] صدى المعلمة الأولى هي $ 1. صدى المعلمة الثانية هي 2 دولار. صدى المبلغ الإجمالي دولار.
لنقم بتشغيل البرنامج النصي ونتحقق من نتيجة الحساب.


برنامج نصي يعثر على مجموع الأرقام التي تم تمريرها إليه

لا يجب أن تكون معلمات سطر الأوامر أرقامًا. يمكنك أيضًا تمرير السلاسل إلى البرامج النصية. على سبيل المثال ، إليك نص برمجي يعمل مع سلسلة:

#! / bin / bash echo مرحبًا $ 1 ، كيف حالك
لنقم بتشغيله:

./myscript آدم
سيخرج ما نتوقعه منه.


البرنامج النصي الذي يعمل مع معلمة سلسلة

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

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

فحص المعلمة

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

#! / bin / bash إذا [-n "$ 1"] ثم صدى مرحبًا $ 1. آخر صدى "لم يتم العثور على معلمات." fi
دعنا نسمي البرنامج النصي أولاً بمعامل ، ثم بدون معلمات.


استدعاء برنامج نصي يتحقق من معلمات سطر الأوامر

عد المعلمات

في البرنامج النصي ، يمكنك حساب عدد المعلمات التي تم تمريرها إليه. يوفر غلاف bash متغيرًا خاصًا لهذا الغرض. وبالتحديد ، يحتوي المتغير $ # على عدد المعلمات التي تم تمريرها إلى البرنامج النصي عند استدعائه.

لنجربها:

#! / bin / bash echo تم تمرير # معلمة.
دعنا نسمي البرنامج النصي.

./myscript 1 2 3 4 5
نتيجة لذلك ، سيبلغ النص البرمجي عن تمرير 5 معلمات إليه.


حساب عدد المعلمات في البرنامج النصي

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

#! / bin / bash echo المعلمة الأخيرة كانت $ (! #)
دعنا نسمي البرنامج النصي ونرى ما يخرجه.


بالإشارة إلى المعلمة الأخيرة

التقاط جميع خيارات سطر الأوامر

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

يحتوي المتغير $ * على جميع المعلمات التي تم إدخالها في سطر الأوامر ككلمة واحدة.

في متغير [بريد إلكتروني محمي]يتم تقسيم المعلمات إلى "كلمات" منفصلة. يمكن تكرار هذه المعلمات في حلقات.

دعونا نرى الفرق بين هذه المتغيرات مع الأمثلة. دعنا نلقي نظرة على محتوياتها أولاً:

#! / bin / bash echo "استخدام الأسلوب \ $ *: $ *" echo "-----------" echo "باستخدام \ [بريد إلكتروني محمي]طريقة: [بريد إلكتروني محمي]"
هنا هو إخراج البرنامج النصي.


المتغيرات $ * و [بريد إلكتروني محمي]

كما ترى ، ناتج كلا المتغيرين هو نفسه. لنحاول الآن استعراض محتويات هذه المتغيرات في حلقات لمعرفة الفرق بينها:

#! / bin / bash count = 1 للمعلمة في "$ *" do echo "\ $ * Parameter # $ count = $ param" count = $ (($ count + 1)) تم العد = 1 للمعلمة في " [بريد إلكتروني محمي]"هل صدى" \ [بريد إلكتروني محمي]تم إنجاز المعلمة # $ count = $ param "count = $ (($ count + 1))
ألق نظرة على ما يخرجه البرنامج النصي إلى وحدة التحكم. الفرق بين المتغيرات واضح جدا.


تحليل $ * و [بريد إلكتروني محمي]في حلقة

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

أمر التحول

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

عند استخدام هذا الأمر ، فإنه يغير قيم المعلمات الموضعية إلى اليسار افتراضيًا. على سبيل المثال ، تصبح قيمة المتغير $ 3 هي قيمة المتغير $ 2 ، وقيمة $ 2 تصبح $ 1 ، ويتم فقدان ما كان سابقًا في $ 1. لاحظ أن هذا لا يغير قيمة المتغير $ 0 الذي يحتوي على اسم البرنامج النصي.

باستخدام الأمر shift ، لنلقِ نظرة على طريقة أخرى للتكرار عبر المعلمات التي تم تمريرها إلى البرنامج النصي:

#! / bin / bash count = 1 بينما [-n "$ 1"] نفذ صدى "Parameter # $ count = $ 1" count = $ (($ count + 1)) التحول تم
يستخدم البرنامج النصي حلقة while ، للتحقق من طول قيمة المعلمة الأولى. عندما يصبح الطول صفرا ، يتم الخروج من الحلقة. بعد التحقق من المعلمة الأولى وعرضها على الشاشة ، يتم استدعاء الأمر shift ، والذي يغير قيم المعلمات بموضع واحد.


استخدام الأمر shift للتكرار عبر المعلمات

عند استخدام الأمر shift ، تذكر أنه في كل مرة تقوم باستدعائها ، تُفقد قيمة المتغير $ 1 بشكل غير قابل للاسترداد.

مفاتيح سطر الأوامر

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

#! / bin / bash echo أثناء [-n "$ 1"] فعل الحالة "$ 1" in -a) صدى "Found the -a option" ؛؛ -b) صدى "Found the -b option" ؛؛ -c) صدى "Found the -c option" ؛؛ *) صدى "$ 1 ليس خيارًا" ؛؛ تحول esac القيام به
لنقم بتشغيل البرنامج النصي:

$ ./myscript –a –b –c –d
ودعنا نحلل ما يعرضه في المحطة.


التعامل مع المفتاح في النص

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

كيفية التمييز بين المفاتيح والمعلمات

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

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

#! / bin / bash بينما [-n "$ 1"] فعل الحالة "$ 1" في -a) صدى "Found the -a option" ؛؛ -b) صدى "Found the -b option" ؛؛ -c) صدى "Found the -c option" ؛؛ -) استراحة التحول ؛؛ *) صدى "$ 1 ليس خيارًا" ؛؛ تحويل esac تم العد = 1 للبارام في [بريد إلكتروني محمي]نفذ صدى "Parameter # $ count: $ param" count = $ (($ count + 1)) تم إنجازه
يستخدم هذا البرنامج النصي الأمر break لمقاطعة حلقة while إذا واجهت شرطة مزدوجة على السطر.

هذا ما تحصل عليه بعد الاتصال به.


التعامل مع مفاتيح سطر الأوامر والمعلمات

كما ترى ، عندما يجد البرنامج النصي ، بتحليل البيانات التي تم تمريرها إليه ، شرطة مزدوجة ، فإنه ينتهي من معالجة المفاتيح ويعتبر كل ما لم تتم معالجته كمعلمات بعد.

التعامل مع المفاتيح بالقيم

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

./myscript -a test1 -b -c test2
يجب أن يكون البرنامج النصي قادرًا على تحديد وقت استخدام معلمات إضافية مع مفاتيح تبديل سطر الأوامر:

#! / bin / bash بينما [-n "$ 1"] فعل الحالة "$ 1" في -a) صدى "Found the -a option" ؛؛ -b) param = "$ 2" echo "تم العثور على الخيار -b ، بقيمة المعلمة $ param" shift ؛؛ -c) صدى "Found the -c option" ؛؛ -) استراحة التحول ؛؛ *) صدى "$ 1 ليس خيارًا" ؛؛ تحويل esac الذي تم العد = 1 للمعلمة في " [بريد إلكتروني محمي]تم تنفيذ "do echo" Parameter # $ count: $ param "count = $ (($ count + 1))
دعنا نسمي هذا البرنامج النصي مثل هذا:

./myscript -a -b test1 -d
دعونا نلقي نظرة على نتائج عمله.


التعامل مع المعلمات الرئيسية

في هذا المثال ، تتم معالجة ثلاثة مفاتيح في بناء الحالة. يتطلب رمز التبديل -b معلمة إضافية. نظرًا لأن المفتاح الذي تتم معالجته موجود في المتغير $ 1 ، فستكون المعلمة المقابلة في $ 2 (يتم استخدام أمر shift هنا ، لذلك ، مع استمرار المعالجة ، يتم نقل كل شيء يتم تمريره إلى البرنامج النصي إلى اليسار). عندما توصلنا إلى هذا ، يبقى فقط استخراج قيمة المتغير $ 2 وسيكون لدينا معلمة المفتاح المطلوب. بالطبع ، هناك حاجة إلى أمر shift آخر هنا حتى يصل المفتاح التالي إلى 1 دولار.

استخدام المفاتيح القياسية

عند كتابة نصوص bash ، يمكنك اختيار أي أحرف لمفاتيح سطر الأوامر وتعيين رد فعل البرنامج النصي على هذه المفاتيح بشكل تعسفي. ومع ذلك ، في عالم Linux ، أصبحت بعض القيم الأساسية شيئًا من المعايير التي من المفيد الالتزام بها. فيما يلي قائمة بهذه المفاتيح:
-a عرض جميع الكائنات.
-ج أداء العد.
-d تحديد الدليل.
-e قم بتوسيع الكائن.
-f حدد الملف الذي تريد قراءة البيانات منه.
-h عرض تعليمات للأمر.
-أتجاهل الحالة.
-l أداء إخراج التنسيق الكامل.
-n استخدم الوضع غير التفاعلي (الدفعي).
-o يسمح لك بتحديد الملف الذي تريد إعادة توجيه الإخراج إليه.
-q تشغيل البرنامج النصي في الوضع الصامت.
-r معالجة المجلدات والملفات بشكل متكرر.
-s تنفيذ البرنامج النصي في الوضع الصامت.
-v تنفيذ الإخراج المطول.
-x استبعاد الكائن.
-y أجب بنعم على جميع الأسئلة.

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

استقبال البيانات من المستخدم

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

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

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

#! / bin / bash echo -n "أدخل اسمك:" اقرأ الاسم صدى "Hello $ name ، مرحبًا بك في برنامجي."
لاحظ أنه يتم استدعاء أمر echo ، الذي يعرض الموجه ، باستخدام المفتاح -n. ينتج عن هذا عدم عرض تغذية سطر في نهاية الموجه ، مما يسمح لمستخدم البرنامج النصي بإدخال البيانات حيث تظهر المطالبة بدلاً من السطر التالي.


التعامل مع مدخلات المستخدم

يمكن تحديد عدة متغيرات عند استدعاء القراءة:

#! / bin / bash read -p "أدخل اسمك:" first last echo "بياناتك لـ $ last، $ first ..."
هذا ما سيخرجه البرنامج النصي بعد الإطلاق.


عدة متغيرات في أمر القراءة

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

#! / bin / bash read -p "أدخل اسمك:" echo مرحبًا $ REPLY ، مرحبًا بك في برنامجي.


استخدام متغير البيئة REPLY

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

#! / bin / bash if read -t 5 -p "أدخل اسمك:" name ثم صدى "Hello $ name ، مرحبًا بك في البرنامج النصي الخاص بي" وإلا صدى "آسف ، بطيء جدًا!" fi
إذا لم يتم إدخال البيانات في غضون 5 ثوانٍ ، فسيقوم البرنامج النصي بتنفيذ فرع عبارة else الشرطية ، مما ينتج عنه اعتذار.


المهلة الزمنية لإدخال البيانات

إدخال كلمات المرور

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

#! / bin / bash read -s -p "أدخل كلمة المرور الخاصة بك:" pass echo "هل كلمة المرور الخاصة بك هي بالفعل $ pass؟"
هذه هي الطريقة التي سيعمل بها هذا البرنامج النصي.


إدخال البيانات السرية

قراءة البيانات من ملف

يمكن لأمر القراءة ، في كل استدعاء ، قراءة سطر واحد من النص من ملف. عندما لا يكون هناك المزيد من الأسطر غير المقروءة في الملف ، فسيتوقف ببساطة. إذا كنت بحاجة إلى الحصول على محتويات الملف بالكامل في نص برمجي ، فيمكنك ، باستخدام خط أنابيب ، نقل نتائج استدعاء الأمر cat للملف ، والبناء while ، الذي يحتوي على الأمر read (بالطبع ، باستخدام cat يبدو الأمر بدائيًا ، لكن هدفنا هو إظهار كل شيء ببساطة قدر الإمكان ، مع التركيز على المبتدئين ؛ سيفهم المستخدمون المتمرسون هذا بالتأكيد).

لنكتب نصًا يستخدم طريقة قراءة الملفات الموضحة للتو.

#! / bin / bash count = 1 cat myfile | أثناء قراءة السطر ، نفذ صدى "Line $ count: $ line" count = $ (($ count + 1)) تم صدى "انتهى"
دعونا نلقي نظرة عليها في العمل.


قراءة البيانات من ملف

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

النتائج

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

في المرة القادمة ، لنتحدث عن عمليات الإدخال والإخراج.

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

getopts هو أمر Bash مضمن يستخدم لتحليل الوسائط التي تم تمريرها إلى البرنامج النصي من سطر الأوامر. يتيح لك التعامل مع سلسلة من الخيارات مجتمعة في وسيطة واحدة والوسيطات الإضافية التي يمررها أحد الخيارات.

# script_name -abc -d / home / user

يتم استخدام المتغيرات المخفية مع الأمر getopts: $ OPTIND و $ OPTARG.

يشير حرف النقطتين الذي يلي اسم الخيار إلى أنه يحتوي على وسيطة اختيارية.

بينما الخيار getopts ": abcde: fg"

عادةً ما يتم حزم getopts في حلقة while ، في كل مرور من الحلقة ، يتم استخراج الخيار التالي ووسيطته (إن وجدت) ومعالجتها ، ثم يتم تقليل المتغير المخفي $ OPTIND بمقدار 1 والانتقال إلى بداية جديد يتم تنفيذ التكرار.

يجب أن يسبق الخيارات التي تم تمريرها إلى البرنامج النصي من سطر الأوامر بحرف ناقص (-) أو زائد (+). تسمح هذه البادئة (- أو +) لـ getopts بتمييز الخيارات عن الوسائط الأخرى. في الواقع ، لن تقوم getopts بمعالجة الحجج ما لم يسبقها - أو + ، وسيتوقف تمييز الخيار بمجرد اكتشاف الوسيطة الأولى.

يختلف بناء حلقة while النموذجية باستخدام getopts اختلافًا طفيفًا عن النموذج القياسي نظرًا لغياب الأقواس المربعة التي تختبر حالة استمرار الحلقة.
يمكنك أن ترى كيف يعمل getopts مع النص التالي.

اختبار getopts

الاستخدام () (
صدى "البرنامج النصي` basename $ 0` يهدف إلى إظهار إمكانيات getopts."
صدى صوت ""
صدى "الاستخدام:` basename $ 0` -abef -c C -d D "
echo -e "\ 033 # هل تم استدعاء النص بدون وسيطات؟
من ثم
الاستخدام # إذا تم إطلاقه بدون وسيطات - عرض المساعدة
اخرج من $ E_OPTERROR # واخرج برمز خطأ
فاي

أثناء خيار getopts "abc: d: ef"
فعل
حالة $ Option في
أ | ب) صدى "الإجراء 1: الخيار - $ الخيار. رقم الخيار: $ OPTIND. الحجة: $ OPTARG "؛؛
ج) صدى "الإجراء 2: الخيار - $ الخيار. رقم الخيار: $ OPTIND. الحجة: $ OPTARG "؛؛
د) صدى "الإجراء 3: الخيار - $ الخيار. رقم الخيار: $ OPTIND. الحجة: $ OPTARG "؛؛
ه) صدى "الإجراء 4: الخيار - $ الخيار. رقم الخيار: $ OPTIND. الحجة: $ OPTARG "؛؛
و) صدى "الإجراء 5: الخيار - $ الخيار. رقم الخيار: $ OPTIND. الحجة: $ OPTARG "؛؛
*) صدى "مفتاح غير صالح محدد".
الاستخدام
خروج $ E_OPTERROR ؛؛ # إفتراضي
esac
انتهى
التحول $ (($ OPTIND - 1))

جرب تشغيله على النحو التالي:

اختبار-getopts -abc مع opt
اختبار-getopts -abefd d-opt

والآن مثل هذا:

اختبار-getopts -abcdef
اختبار getopts -cd d-opt

يرتبط سلوك getopts هذا بحقيقة أن الخيار -c يتوقع وسيطة إضافية.