9 أمثلة على حلقات for في نصوص Bash في Linux

باش متعدد الاستخدامات for إن loop تفعل أكثر من مجرد تكرار عدد محدد من المرات. نحن نوضح أشكالها المتعددة حتى تتمكن من استخدامها بنجاح في نصوص Linux الخاصة بك.




حلقة for

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

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

يحتوي نص الحلقة على الكود الذي تريد تكراره. وهو يحتوي على ما تريد أن تفعله الحلقة. ويمكن أن يحتوي نص الحلقة على أي أمر نصي صالح.


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

حلقات بسيطة

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

حلقات for باستخدام القوائم الرقمية

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

for i in 1 2 3 4 5; do echo $i; done

حلقة for للعد من 1 إلى 5


ومن المهم أن نلاحظ هنا أن المتغير i يتم زيادتها بمقدار واحد في كل مرة تدور فيها الحلقة، ولكن هذا لأن قائمة الأرقام تزداد بمقدار واحد في كل مرة.

تبدأ هذه القائمة من الأرقام من 3 وترتفع بخطوات مقدارها اثنان، ثم تقفز بشكل عشوائي إلى 44.

for i in 3 5 7 9 11 44; do echo $i; done

حلقة for للعد من خلال قائمة غير متسلسلة من الأرقام

لا يوجد فرق في ذلك for حلقة. تبدأ من أحد طرفي القائمة وتستخدم كل قيمة بالترتيب، حتى يتم استخدام كل القيم في القائمة.

ولا يلزم أن تكون الأرقام مرتبة ترتيبًا تصاعديًا، بل يمكن أن تكون بأي ترتيب.

for i in 3 43 44 11 9; do echo $i; done


حلقة for للعد من خلال قائمة غير مرتبة من الأرقام

حلقات for باستخدام قوائم الكلمات

يمكننا بسهولة القيام بنفس الشيء مع الكلمات. انسخ نص البرنامج النصي إلى محرر واحفظه باسم “word-list.sh”.

#!/bin/bash
for word in This is a sequence of words
do
 echo $word
done

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

chmod +x word-list.sh

جعل البرنامج النصي قابلاً للتنفيذ باستخدام chmod

دعونا ننفذ البرنامج النصي.

./word-list.sh


حلقة for تعمل من خلال قائمة من الكلمات

تمامًا كما حدث مع الأرقام، المُكرر—في هذا المثال، المتغير word—تشق طريقها عبر قائمة عناصر البيانات حتى تصل إلى نهاية القائمة. يصل نص الحلقة إلى القيمة الموجودة في word متغير وبالتالي تتم معالجة كل كلمة في القائمة.

حلقات for مع نطاقات رقمية

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

هذا البرنامج النصي هو “number-range.sh”.

#!/bin/bash
for i in {1..10}
do
 echo "Loop spin:" $i
done

يتم تعريف نطاق الأرقام بين قوسين متعرجين “{}“مع نقطتين”..“فصل الأرقام التي تبدأ وتنتهي في النطاق. تأكد من عدم تضمين أي مسافات في تعريف النطاق.

هكذا يتم تشغيله:

./number-range.sh


حلقة for باستخدام نطاق رقمي

يمكنك تضمين رقم آخر يحدد حجم الخطوة التي يجب أن يستخدمها المُكرر للتنقل عبر الأرقام الموجودة في النطاق. سيستخدم هذا البرنامج النصي “number-range2.sh” نطاقًا يتراوح من 0 إلى 32 وحجم خطوة يبلغ 4.

#!/bin/bash
for i in {0..32..4}
do
 echo "Loop spin:" $i
done

يقوم المتكرر بالمرور عبر نطاق الأرقام في قفزات مكونة من أربعة.

./number-range2.sh

حلقة for باستخدام خطوة تكرارية 4

حلقات for باستخدام أسماء الملفات

نظرًا لأننا نستطيع معالجة قوائم الكلمات، فيمكننا تشغيل البرامج النصية الخاصة بنا مع أسماء الملفات. يُسمى هذا البرنامج النصي “filenames.sh”.


#!/bin/bash
for file in word-list.sh number-range.sh number-range2.sh filenames.sh
do
 ls -lh "$file"
done

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

./filenames.sh

حلقة for باستخدام قائمة أسماء الملفات

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

يُسمى هذا البرنامج النصي “filenames2.sh”. لقد قمنا باستبدال قائمة أسماء الملفات بنمط اسم الملف “*.sh” حتى يتمكن البرنامج النصي من الإبلاغ عن جميع ملفات البرامج النصية في الدليل الحالي.

#!/bin/bash
for file in *.sh
do
 ls -lh "$file"
done

وهنا الناتج.

./filenames2.sh


حلقة for باستخدام نمط ملف *.sh

حلقات for باستخدام معلمات سطر الأوامر

يمكننا إضافة المزيد من المرونة عن طريق تمرير نمط اسم الملف على سطر الأوامر. $* يمثل المتغير جميع معلمات سطر الأوامر التي تم تمريرها إلى البرنامج النصي.

هذا هو “filenames3.sh.”

#!/bin/bash
for file in $*
do
 ls -lh "$file"
done

سنطلب أسماء الملفات التي تبدأ بـ “n” ولها امتداد SH.

./filenames3.sh n*.sh

حلقة for تأخذ نمط ملف كمعلمة لسطر الأوامر

يمكننا أيضًا تمرير أكثر من نمط في وقت واحد.

./filenames3.sh n*.sh .bashrc


حلقة for تأخذ نمط ملف واسم ملف من معلمات سطر الأوامر

متغير المتكرر file يأخذ قيمة كل من معلمات سطر الأوامر. يتم توسيع أنماط أسماء الملفات، ويتم معالجة جميع أسماء الملفات في نص الحلقة.

حلقات تشبه الحرف C

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

  • القيمة الأولية لمكرر الحلقة.
  • الاختبار لمعرفة ما إذا كانت الحلقة مستمرة أم تنتهي.
  • زيادة أو نقصان المُكرر.

هذا البرنامج النصي هو “c-like.sh”.

المُكرر I يتم ضبطه على 1 في بداية الحلقة، وسيتم تشغيل الحلقة طالما أن العبارة ” i<=10 “هذا صحيح. بمجرد i يصل إلى 11، for ستتوقف الحلقة. يتم زيادة المُكرر بمقدار واحد، مع كل دورة من دورات الحلقة.


#!/bin/bashfor (( i=1; i<=10; i++ ))
do
 echo "Loop number:" $i
done

دعونا نشغل هذا البرنامج النصي.

./c-like.sh

حلقة ثلاثية الحدود أو حلقة تشبه حرف C

مثل حرف C for تسمح الحلقة بإنشاء سهل لـ for حلقات لها متطلبات غريبة بعض الشيء. تبدأ هذه الحلقة عند 15، وتحسب للخلف بخطوات من 3. هذا هو “c-like2.sh”

#!/bin/bash
for (( i=15; i>0; i-=3 ))
do
 echo "Loop number:" $i
done

عندما نقوم بتشغيله، يجب أن يقفز للخلف بخطوات مكونة من ثلاث خطوات.

./c-like2.sh

حلقة تشبه حرف C وتحسب للخلف

حلقات لانهائية

يمكنك أيضًا استخدام هذا التنسيق for لإنشاء حلقة لا نهائية. كل ما عليك فعله هو إزالة جميع العناصر من رأس الحلقة، مثل هذا. هذا هو “infinite.sh”.


#!/bin/bash
for (( ; ; ))
do
 echo "Press Ctrl+C to stop..."
 sleep 1
done

سوف تحتاج إلى الضغط على Ctrl+C لإيقاف الحلقة.

./infinite.sh

حلقة لا نهائية تشبه C

حلقات for باستخدام مصفوفات الكلمات

يمكننا بسهولة تكرار مجموعة من الكلمات. نحتاج إلى توفير اسم المجموعة في رأس الحلقة، وسيقوم المُكرر بالتنقل عبر جميع الإدخالات في المجموعة. هذا هو “word-array.sh”.

#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
 echo $distro
done

تمت إدراج كافة التوزيعات لنا.

./word-array.sh

حلقة for باستخدام مصفوفة الكلمات


الأمر الاستمرار

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

هذا هو “word-array2.sh.” وهو يتخطى مدخل المصفوفة “Arch” ولكنه يعالج جميع أعضاء المصفوفة الآخرين.

#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributionsdo
 if (( "$distro" == "Arch" )) ;
   then
   continue
 fi
 echo $distro
done

لا يظهر “Arch” في نافذة المحطة الطرفية.

./word-array2.sh

حلقة for تتخطى إدخالاً في مصفوفة الكلمات بسبب أمر الاستمرار

أمر الاستراحة

ال break يؤدي الأمر إلى الخروج من الحلقة ومنع أي معالجة أخرى.

هذا هو “word-array3.sh.” وهو نفس النص السابق مع continue تم استبداله بـ break.


#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
 if (( "$distro" == "Arch" )) ;
   then
   break
 fi
 echo $distro
done

عندما يحتوي المُكرر على “Arch”، تتخلى حلقة for عن أي معالجة أخرى.

./word-array3.sh

حلقة for تتخلى عن المزيد من المعالجة بسبب أمر break

حلقات for باستخدام المصفوفات الترابطية

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

يمكننا التكرار من خلال مجموعة ارتباطية باستخدام for الحلقة. هذا البرنامج النصي هو “associative.sh”. وهو يحدد مصفوفة ارتباطية تحتوي على أربعة مدخلات، واحدة لكل من “dog” و”cat” و”robin” و”human”. هذه هي المفاتيح. القيم هي عدد الأرجل (الافتراضي) التي يحتوي عليها كل منها.


#!/bin/bash

declare -A animals=( (dog)=Four-legged (cat)=Four-legged (robin)=Two-legged (human)=Two-legged )

for legs in ${!animals(@)}
do
  if ( ${animals($legs)} == "Two-legged" ); then
    echo ${legs}
  fi
done

يُطلق على المُكرر اسم legs لاحظ أن رأس الحلقة يحتوي على “!“علامة تعجب. لا تعمل هذه العلامة كمشغل NOT منطقي، بل هي جزء من بناء جملة المصفوفة الترابطية. وهي مطلوبة للبحث في المصفوفة.

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

./associative.sh

استخدام حلقة for لاستخراج العناصر من مصفوفة ارتباطية

التكرار على مخرجات الأوامر

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


هذا البرنامج النصي هو “command.sh.” وهو يستخدم ls و wc لتوفير قائمة مرتبة لأسماء ملفات النصوص، بالإضافة إلى عدد أسطرها، وكلماتها، وبايتاتها.

#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done 

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

./command.sh

استخدام حلقة for للتكرار على إخراج أمرين مترابطين

الحلقة المبهرة

ال for تعد loop أداة برمجة نصية متعددة الاستخدامات وسهلة الفهم. ولكن على الرغم من مرونتها، فلا تنسَ أن الحلقات الأخرى موجودة لسبب ما. لا تنبهر بالتفكير في أن for الحلقة هي كل ما ستحتاجه.

ذات صلة: كيفية معالجة ملف سطرًا بسطر في نص Bash لنظام Linux

ال while على سبيل المثال، تعتبر الحلقة أكثر ملاءمة لأشياء معينة من for حلقة، مثل قراءة الأسطر من ملف.


كتابة نصوص جيدة تعني استخدام الأداة الأكثر ملاءمة للمهمة المطروحة. for تعتبر الحلقة أداة رائعة يجب أن تكون ضمن مجموعة أدوات الحيل الخاصة بك.

أضف تعليق