تعد نصوص Bash وسيلة فعالة للغاية لأتمتة المهام ، لا سيما تلك التي تستفيد من البرامج الموجودة الأخرى. غالبًا ما تتطلب هذه الأتمتة تكرار عملية مماثلة عدة مرات ، وهو بالضبط مكان ملف لحلقة يأتي بمفرده.
عادة ما يكون مديرو أنظمة Linux و Mac على دراية بالبرمجة النصية عبر الجهاز ، ولكن حتى مستخدمي Windows يمكنهم ذلك ابدأ العمل مع نظام Windows الفرعي لنظام Linux.
لا تحتاج إلى استخدام Linux وقتًا للتبديل إلى جهاز كمبيوتر مختلف أو تشغيل جهاز VM؟ قم بتشغيل Linux في نظام التشغيل Windows 10 باستخدام محطة Bash shell بدلاً من ذلك!
كيف تعمل مخطوطات باش
برنامج bash هو ببساطة ملف نصي عادي يحتوي على سلسلة من الأوامر التي يمكن لقشرة bash قراءتها وتنفيذها. Bash هو الغلاف الافتراضي في نظام التشغيل macOS قبل كاتالينا ومعظم توزيعات Linux.
إذا لم تكن قد تعاملت مع نص شيل من قبل ، فيجب أن تبدأ بأبسط حالة على الإطلاق. سيسمح لك هذا بممارسة المفاهيم الأساسية بما في ذلك إنشاء البرنامج النصي وتنفيذه.
أولاً ، قم بإنشاء الملف التالي في موقع مناسب (من الناحية المثالية ، افتح Terminal وانتقل إلى الدليل المطلوب أولاً):
#! / بن / باش
صدى "Hello، World"
يخبر السطر الأول كل ما يشغل هذا البرنامج بكيفية تشغيله (أي باستخدام مترجم bash). الثاني هو مجرد أمر مثل أي أمر آخر قد تدخله في سطر الأوامر. احفظ هذا الملف كملف hello_world.sh، من ثم:
$ chmod + x hello_world.sh
$ ./hello_world.sh
ال chmod الأمر الموجود في السطر الأول يجعل الملف قابلاً للتنفيذ ، مما يعني أنه يمكن تشغيله بكتابة اسمه ، كما في السطر الثاني.
إذا رأيت الكلمات "Hello، World" تظهر مطبوعة على سطر في جهازك الطرفي ، فكل شيء يعمل كما هو مطلوب.
كيفية عمل الحلقات
في البرمجة العامة ، هناك نوعان رئيسيان من حلقة for: رقمي و foreach. عادةً ما يكون النوع الرقمي هو الأكثر شيوعًا ، ولكن في استخدام bash ، عادةً ما يكون العكس.
عادةً ما تركز حلقات for الرقمية على عدد صحيح واحد يحدد عدد التكرارات التي سيتم تنفيذها ، على سبيل المثال:
لـ (أنا = 0 ؛ أنا <100 ؛ أنا ++) {
/ * جمل للتنفيذ بشكل متكرر * /
}
هذه حلقة بحث مألوفة تتكرر 100 مرة بالضبط ، ما لم يتم تغيير i داخل الحلقة ، أو تسبب عبارة أخرى في توقف تنفيذ الحلقة for.
على النقيض من ذلك ، تميل حلقات Foreach إلى العمل على هياكل مثل القوائم أو المصفوفات ، وتقوم بالتكرار لكل عنصر ضمن تلك المجموعة:
الناس = ["بطرس" ، "بول" ، "مريم"]
foreach (الأشخاص كشخص) {
إذا (شخص == "بول") {
...
}
}
تستخدم بعض اللغات تركيبًا مختلفًا بعض الشيء والذي يبدل ترتيب التجميع والعنصر:
الناس = ["بطرس" ، "بول" ، "مريم"]
لـ (شخص في الأشخاص) {
إذا (شخص == "بول") {
...
}
}
في الحلقات
في باش ، فإن foreach - أو في- الحلقة أكثر شيوعًا. الصيغة الأساسية هي ببساطة:
للحج في [قائمة]
فعل
/ * جمل للتنفيذ بشكل متكرر * /
/ * يمكن الحصول على قيمة arg باستخدام $ arg * /
انتهى
على سبيل المثال ، للتكرار من خلال ثلاثة ملفات مسماة بشكل صريح:
للملف في one.c two.c three.c
فعل
ls "ملف $"
انتهى
إذا كانت هذه الملفات موجودة في الدليل الحالي ، فسيكون ناتج هذا البرنامج النصي:
واحد
اثنان
ثلاثة
بدلاً من مجموعة ثابتة من الملفات ، يمكن الحصول على القائمة عبر نمط الكرة الأرضية (أحدها يتضمن أحرف البدل - أحرف خاصة تمثل أحرفًا أخرى). في المثال التالي ، تتكرر حلقة for عبر جميع الملفات (في الدليل الحالي) التي تنتهي أسماؤها بـ ".xml":
للملف في * .xml
فعل
ls -l "ملف $"
انتهى
إليك بعض الأمثلة على الإخراج:
$ -rw-r - r-- 1 bobby staff 2436 3 نوفمبر 2019 feed.xml
$ -rw-r - r-- 1 bobby staff 6447 27 أكتوبر 16:24 sitemap.xml
قد يبدو هذا إلى حد كبير وكأنه طريقة طويلة الأمد للقيام:
$ ls -l * .xml
ولكن هناك فرق كبير: حلقة for تنفذ ملف ls البرنامج مرتين منفصلتين ، مع اسم ملف واحد يتم تمريره إليه في كل مرة. في مثال ls المنفصل ، يتطابق نمط glob (* .xml) مع أسماء الملفات أولاً ثم يرسلها جميعًا ، كمعلمات سطر أوامر فردية ، إلى مثيل واحد من ls.
فيما يلي مثال يستخدم امتداد مرحاض برنامج (عدد الكلمات) لجعل الفرق أكثر وضوحًا:
$ wc -l * .xml
44 feed.xml
231 ملف sitemap.xml
مجموع 275
ال مرحاض يقوم البرنامج بحساب عدد الأسطر في كل ملف على حدة ، ثم يقوم بطباعة العدد الإجمالي عبر كل منهم. في المقابل ، إذا مرحاض تعمل ضمن حلقة for:
للملف في * .xml
فعل
wc -l $ file
انتهى
ستظل ترى عدد كل ملف:
44 feed.xml
231 ملف sitemap.xml
ولكن لا يوجد إجمالي ملخص إجمالي لأن مرحاض يتم تشغيله بشكل منفصل ، في كل مرة تتكرر فيها الحلقة.
عندما تكون القائمة ليست قائمة
هناك خطأ شائع وسهل جدًا عند التعامل مع حلقات for ، نظرًا للطريقة التي يتعامل بها bash مع الوسائط / السلاسل المقتبسة. يجب إجراء التكرار عبر قائمة الملفات على النحو التالي:
للملف في one.c two.c
ليس كذلك:
للملف في "one.c two.c"
يتضمن المثال الثاني أسماء الملفات بين علامتي اقتباس مما ينتج عنه قائمة بمعامل واحد فقط ؛ سيتم تنفيذ حلقة for مرة واحدة فقط. يمكن تجنب هذه المشكلة باستخدام متغير في مثل هذه الحالات:
الملفات = "one.c two.c"
لملف في $ FILES
فعل
...
انتهى
لاحظ أن إعلان المتغير نفسه لا يحتاج إلى وضع قيمته بين علامتي اقتباس!
بدون قائمة
مع عدم وجود أي شيء للتكرار ، تعمل حلقة for على أي وسيطات سطر أوامر تم توفيرها للنص البرمجي عند استدعائه. على سبيل المثال ، إذا كان لديك برنامج نصي اسمه أرجس ش تحتوي على ما يلي:
#! / بن / ش
ل
فعل
صدى $ أ
انتهى
ثم تنفيذ args.sh سوف يعطيك ما يلي:
$ ./args.sh واحد اثنان ثلاثة
واحد
اثنين
ثلاثة
يتعرف باش على هذه الحالة ويعاملها للقيام كمكافئ في $ @ do حيث $ @ هو متغير خاص يمثل وسيطات سطر الأوامر.
محاكاة رقم تقليدي للحلقة
غالبًا ما تتعامل نصوص Bash مع قوائم الملفات أو سطور الإخراج من الأوامر الأخرى ، لذا فإن نوع الحلقة for in هو أمر شائع. ومع ذلك ، لا تزال العملية التقليدية ذات النمط c مدعومة:
لـ ((i = 1 ؛ أنا <= 5 ؛ أنا ++))
فعل
صدى $ أنا
انتهى
هذا هو الشكل الكلاسيكي المكون من ثلاثة أجزاء حيث:
- يتم تهيئة المتغير (i = 1) عند مواجهة الحلقة لأول مرة
- تستمر الحلقة طالما أن الشرط (i <= 5) صحيح
- في كل مرة حول الحلقة ، المتغير يزداد (i ++)
يعد التكرار بين قيمتين مطلبًا شائعًا بدرجة كافية بحيث يكون هناك بديل أقصر وأقل إرباكًا:
لأني في {1..5}
فعل
صدى $ أنا
انتهى
يؤدي توسيع الدعامة الذي يحدث بشكل فعال إلى ترجمة حلقة for أعلاه إلى:
لأني في 1 2 3 4
التحكم الدقيق في الحلقة مع استراحة ومتابعة
غالبًا ما تحتاج حلقات for الأكثر تعقيدًا إلى طريقة للخروج مبكرًا أو إعادة تشغيل الحلقة الرئيسية فورًا بالقيمة التالية بدورها. للقيام بذلك ، يستعير bash عبارات break and continue الشائعة في لغات البرمجة الأخرى. إليك مثال يستخدم كلاهما للعثور على الملف الأول الذي يزيد طوله عن 100 حرف:
#! / بن / باش
للملف في *
فعل
لو [! -f "ملف $"]
من ثم
صدى "$ file is not a file"
استمر
فاي
num_chars = $ (wc -c حجم ملف echo $ "num_chars $ من الأحرف طويلة"
إذا [$ num_chars -gt 100]
من ثم
صدى "Found $ file"
فترة راحة
فاي
انتهى
تعمل حلقة for هنا على جميع الملفات الموجودة في الدليل الحالي. إذا لم يكن الملف ملفًا عاديًا (على سبيل المثال ، إذا كان دليلًا) ، فسيتم استخدام عبارة المتابعة لإعادة تشغيل الحلقة مع الملف التالي بدوره. إذا كان ملفًا عاديًا ، فستحدد الكتلة الشرطية الثانية ما إذا كان يحتوي على أكثر من 100 حرف. إذا كان الأمر كذلك ، يتم استخدام تعليمة break لترك الحلقة for على الفور (وتصل إلى نهاية النص البرمجي).
استنتاج
سكربت bash هو ملف يحتوي على مجموعة من التعليمات التي يمكن تنفيذها. تسمح حلقة for بتكرار جزء من البرنامج النصي عدة مرات. باستخدام المتغيرات والأوامر الخارجية وعبارات الفصل والمتابعة ، يمكن لنصوص bash تطبيق منطق أكثر تعقيدًا وتنفيذ مجموعة واسعة من المهام.
يشير التقرير إلى أن تسميات خصوصية تطبيقات Apple قد تواجه بعض المشكلات.
- برمجة
- لينكس
بوبي متحمس للتكنولوجيا وعمل كمطور برمجيات لأكثر من عقدين من الزمن. إنه شغوف بالألعاب ، ويعمل كمحرر المراجعات في مجلة Switch Player ، وهو منغمس في جميع جوانب النشر عبر الإنترنت وتطوير الويب.
اشترك في نشرتنا الإخبارية
انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!
خطوة أخرى أيضا…!
يرجى تأكيد عنوان بريدك الإلكتروني في البريد الإلكتروني الذي أرسلناه لك للتو.