كل ما تحتاج لمعرفته حول Bash For Loops في Linux

كل ما تحتاج لمعرفته حول Bash For Loops في Linux

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





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





كيف تعمل مخطوطات باش

برنامج bash هو ببساطة ملف نصي عادي يحتوي على سلسلة من الأوامر التي يمكن لقشرة bash قراءتها وتنفيذها. Bash هو الغلاف الافتراضي في نظام التشغيل macOS قبل كاتالينا ومعظم توزيعات Linux.





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

أولاً ، قم بإنشاء الملف التالي في موقع مناسب (من الناحية المثالية ، افتح Terminal وانتقل إلى الدليل المطلوب أولاً):



#!/bin/bash
echo 'Hello, World'

يخبر السطر الأول كل ما يشغل هذا البرنامج بكيفية تشغيله (أي باستخدام مترجم bash). الثاني هو مجرد أمر مثل أي أمر آخر قد تدخله في سطر الأوامر. احفظ هذا الملف كملف hello_world.sh ، من ثم:

$ chmod +x hello_world.sh
$ ./hello_world.sh

ال chmod الأمر الموجود في السطر الأول يجعل الملف قابلاً للتنفيذ ، مما يعني أنه يمكن تشغيله بكتابة اسمه ، كما في السطر الثاني.





إذا رأيت الكلمتين Hello ، World تظهر مطبوعة على سطر في جهازك الطرفي ، فكل شيء يعمل كما هو مطلوب.

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

في البرمجة العامة ، هناك نوعان رئيسيان من حلقة for: رقمي و foreach . عادةً ما يكون النوع الرقمي هو الأكثر شيوعًا ، ولكن في استخدام bash ، عادةً ما يكون العكس.





عادةً ما تركز حلقات for الرقمية على عدد صحيح واحد يحدد عدد التكرارات التي سيتم تنفيذها ، على سبيل المثال:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

هذه حلقة بحث مألوفة تتكرر 100 مرة بالضبط ، ما لم يتم تغيير i داخل الحلقة ، أو تسبب عبارة أخرى في توقف تنفيذ الحلقة for.

على النقيض من ذلك ، تميل حلقات Foreach إلى العمل على هياكل مثل القوائم أو المصفوفات ، وتقوم بالتكرار لكل عنصر ضمن تلك المجموعة:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

تستخدم بعض اللغات تركيبًا مختلفًا بعض الشيء والذي يبدل ترتيب التجميع والعنصر:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

في الحلقات

في باش ، فإن foreach - أو في - الحلقة أكثر شيوعًا. الصيغة الأساسية هي ببساطة:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

على سبيل المثال ، للتكرار من خلال ثلاثة ملفات مسماة بشكل صريح:

كيفية إيقاف تشغيل مقاطع الفيديو المقترحة على youtube 2016
for file in one.c two.c three.c
do
ls '$file'
done

إذا كانت هذه الملفات موجودة في الدليل الحالي ، فسيكون ناتج هذا البرنامج النصي:

one.c
two.c
three.c

بدلاً من مجموعة ثابتة من الملفات ، يمكن الحصول على القائمة عبر نمط الكرة الأرضية (أحدها يتضمن أحرف البدل - أحرف خاصة تمثل أحرفًا أخرى). في المثال التالي ، تتكرر حلقة for عبر جميع الملفات (في الدليل الحالي) التي تنتهي أسماؤها بـ '.xml':

for file in *.xml
do
ls -l '$file'
done

إليك بعض الأمثلة على الإخراج:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

قد يبدو هذا إلى حد كبير مثل طريقة عمل طويلة الأمد:

$ ls -l *.xml

ولكن هناك فرق كبير: حلقة for تنفذ ملف ls البرنامج مرتين منفصلتين ، مع اسم ملف واحد يتم تمريره إليه في كل مرة. في مثال ls المنفصل ، يتطابق نمط glob (* .xml) مع أسماء الملفات أولاً ثم يرسلها جميعًا ، كمعلمات سطر أوامر فردية ، إلى مثيل واحد من ls .

إليك مثال على استخدام الامتداد مرحاض برنامج (عدد الكلمات) لجعل الفرق أكثر وضوحًا:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

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

for file in *.xml
do
wc -l $file
done

ستظل ترى عدد كل ملف:

44 feed.xml
231 sitemap.xml

ولكن لا يوجد إجمالي ملخص إجمالي لأن مرحاض يتم تشغيله بشكل منفصل ، في كل مرة تتكرر فيها الحلقة.

عندما تكون القائمة ليست قائمة

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

for file in one.c two.c

ليس كذلك:

for file in 'one.c two.c'

يتضمن المثال الثاني أسماء الملفات بين علامتي اقتباس مما ينتج عنه قائمة بمعامل واحد فقط ؛ سيتم تنفيذ حلقة for مرة واحدة فقط. يمكن تجنب هذه المشكلة باستخدام متغير في مثل هذه الحالات:

FILES='one.c two.c'
for file in $FILES
do
...
done

لاحظ أن إعلان المتغير نفسه لا يحتاج إلى وضع قيمته بين علامتي اقتباس!

كيف ترفع يدك عند التكبير

بدون قائمة

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

#!/bin/sh
for a
do
echo $a
done

ثم تنفيذ args.sh سوف يعطيك ما يلي:

$ ./args.sh one two three
one
two
three

يتعرف باش على هذه الحالة ويعاملها للقيام كمكافئ ل في $ @ do حيث $ @ هو متغير خاص يمثل وسيطات سطر الأوامر.

محاكاة رقم تقليدي للحلقة

غالبًا ما تتعامل نصوص Bash مع قوائم الملفات أو أسطر الإخراج من الأوامر الأخرى ، لذا فإن نوع الحلقة for in هو أمر شائع. ومع ذلك ، لا تزال العملية التقليدية ذات النمط c مدعومة:

for (( i=1; i<=5; i++ ))
do
echo $i
done

هذا هو الشكل الكلاسيكي المكون من ثلاثة أجزاء حيث:

  1. يتم تهيئة المتغير (i = 1) عند مواجهة الحلقة لأول مرة
  2. تستمر الحلقة ما دامت الحالة (i<=5) is true
  3. في كل مرة حول الحلقة ، المتغير يزداد (i ++)

يعد التكرار بين قيمتين مطلبًا شائعًا بدرجة كافية بحيث يكون هناك بديل أقصر وأقل إرباكًا:

for i in {1..5}
do
echo $i
done

يؤدي توسيع الدعامة الذي يحدث بشكل فعال إلى ترجمة حلقة for أعلاه إلى:

for i in 1 2 3 4

التحكم الدقيق في الحلقة مع استراحة ومتابعة

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

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

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

استنتاج

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

يشارك يشارك سقسقة بريد الالكتروني هل يستحق الترقية إلى Windows 11؟

تم إعادة تصميم Windows. لكن هل هذا كافٍ لإقناعك بالانتقال من Windows 10 إلى Windows 11؟

اقرأ التالي
مواضيع ذات صلة
  • برمجة
  • لينكس
نبذة عن الكاتب بوبي جاك(تم نشر 58 مقالة)

بوبي متحمس للتكنولوجيا وعمل كمطور برمجيات لأكثر من عقدين من الزمن. إنه شغوف بالألعاب ، ويعمل كمحرر المراجعات في مجلة Switch Player ، ومنغمس في جميع جوانب النشر عبر الإنترنت وتطوير الويب.

المزيد من Bobby Jack

اشترك في نشرتنا الإخبارية

انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!

انقر هنا للاشتراك