باش متعدد الاستخدامات for
إن loop تفعل أكثر من مجرد تكرار عدد محدد من المرات. نحن نوضح أشكالها المتعددة حتى تتمكن من استخدامها بنجاح في نصوص Linux الخاصة بك.
حلقة for
تحتوي جميع لغات البرمجة والنصوص على طريقة ما للتعامل مع الحلقات. الحلقة هي جزء من التعليمات البرمجية التي تريد تنفيذها بشكل متكرر. بدلاً من كتابة نفس مجموعة التعليمات في النص البرمجي الخاص بك، مرارًا وتكرارًا، ستكرر الحلقة جزءًا واحدًا من التعليمات البرمجية مرارًا وتكرارًا نيابةً عنك.
الحفلة for
الحلقة مرنة للغاية. يمكنها العمل مع الأرقام أو الكلمات أو المصفوفات أو متغيرات سطر الأوامر أو مخرجات الأوامر الأخرى. يتم استخدام هذه في رأس الحلقة. يحدد الرأس ما تعمل عليه الحلقة – الأرقام أو السلاسل، على سبيل المثال – وما هو الشرط النهائي الذي سيوقف الحلقة.
يحتوي نص الحلقة على الكود الذي تريد تكراره. وهو يحتوي على ما تريد أن تفعله الحلقة. ويمكن أن يحتوي نص الحلقة على أي أمر نصي صالح.
يتم استخدام متغير يسمى عداد الحلقة أو المُكرر للتنقل عبر نطاق من القيم أو قائمة من عناصر البيانات. لكل حلقة، يأخذ المُكرر قيمة الرقم التالي أو السلسلة أو أي نوع بيانات يتم تكرار الحلقة عليه. يسمح هذا للحلقة بالعمل مع قيم كل عنصر من عناصر البيانات بدوره، أو حتى في بعض الحالات التلاعب بعناصر البيانات نفسها.
حلقات بسيطة
إذا كنت تتطلع إلى كتابة أول حلقة for الخاصة بك، فستساعدك هذه الأمثلة البسيطة على البدء.
حلقات for باستخدام القوائم الرقمية
يمكنك تشغيل for
حلقة على سطر الأوامر. يقوم هذا الأمر بإنشاء وتنفيذ أمر بسيط for
حلقة. المُكرر هو متغير يُسمى i
. سنقوم بتعيين i
أن تكون كل قيمة من القيم في قائمة الأرقام، بدورها. سيطبع نص الحلقة تلك القيمة في نافذة المحطة الطرفية. الشرط الذي ينهي هذه الحلقة هو عندما i
تم التكرار عبر القائمة الكاملة للأرقام.
for i in 1 2 3 4 5; do echo $i; done
ومن المهم أن نلاحظ هنا أن المتغير i
يتم زيادتها بمقدار واحد في كل مرة تدور فيها الحلقة، ولكن هذا لأن قائمة الأرقام تزداد بمقدار واحد في كل مرة.
تبدأ هذه القائمة من الأرقام من 3 وترتفع بخطوات مقدارها اثنان، ثم تقفز بشكل عشوائي إلى 44.
for i in 3 5 7 9 11 44; do echo $i; done
لا يوجد فرق في ذلك for
حلقة. تبدأ من أحد طرفي القائمة وتستخدم كل قيمة بالترتيب، حتى يتم استخدام كل القيم في القائمة.
ولا يلزم أن تكون الأرقام مرتبة ترتيبًا تصاعديًا، بل يمكن أن تكون بأي ترتيب.
for i in 3 43 44 11 9; do echo $i; done
حلقات 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
دعونا ننفذ البرنامج النصي.
./word-list.sh
تمامًا كما حدث مع الأرقام، المُكرر—في هذا المثال، المتغير 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
يمكنك تضمين رقم آخر يحدد حجم الخطوة التي يجب أن يستخدمها المُكرر للتنقل عبر الأرقام الموجودة في النطاق. سيستخدم هذا البرنامج النصي “number-range2.sh” نطاقًا يتراوح من 0 إلى 32 وحجم خطوة يبلغ 4.
#!/bin/bash
for i in {0..32..4}
do
echo "Loop spin:" $i
done
يقوم المتكرر بالمرور عبر نطاق الأرقام في قفزات مكونة من أربعة.
./number-range2.sh
حلقات 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
بطريقة مماثلة لاستخدام نطاق الأرقام، يمكننا استخدام نمط ملف في رأس الحلقة لتحديد الملفات التي نريد معالجتها. وهذا يتجنب الكثير من الكتابة ويعني أننا لا نحتاج إلى معرفة أسماء الملفات مسبقًا.
يُسمى هذا البرنامج النصي “filenames2.sh”. لقد قمنا باستبدال قائمة أسماء الملفات بنمط اسم الملف “*.sh” حتى يتمكن البرنامج النصي من الإبلاغ عن جميع ملفات البرامج النصية في الدليل الحالي.
#!/bin/bash
for file in *.sh
do
ls -lh "$file"
done
وهنا الناتج.
./filenames2.sh
حلقات for باستخدام معلمات سطر الأوامر
يمكننا إضافة المزيد من المرونة عن طريق تمرير نمط اسم الملف على سطر الأوامر. $*
يمثل المتغير جميع معلمات سطر الأوامر التي تم تمريرها إلى البرنامج النصي.
هذا هو “filenames3.sh.”
#!/bin/bash
for file in $*
do
ls -lh "$file"
done
سنطلب أسماء الملفات التي تبدأ بـ “n” ولها امتداد SH.
./filenames3.sh n*.sh
يمكننا أيضًا تمرير أكثر من نمط في وقت واحد.
./filenames3.sh n*.sh .bashrc
متغير المتكرر 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 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
حلقات لانهائية
يمكنك أيضًا استخدام هذا التنسيق for
لإنشاء حلقة لا نهائية. كل ما عليك فعله هو إزالة جميع العناصر من رأس الحلقة، مثل هذا. هذا هو “infinite.sh”.
#!/bin/bash
for (( ; ; ))
do
echo "Press Ctrl+C to stop..."
sleep 1
done
سوف تحتاج إلى الضغط على Ctrl+C لإيقاف الحلقة.
./infinite.sh
حلقات for باستخدام مصفوفات الكلمات
يمكننا بسهولة تكرار مجموعة من الكلمات. نحتاج إلى توفير اسم المجموعة في رأس الحلقة، وسيقوم المُكرر بالتنقل عبر جميع الإدخالات في المجموعة. هذا هو “word-array.sh”.
#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
echo $distro
done
تمت إدراج كافة التوزيعات لنا.
./word-array.sh
الأمر الاستمرار
إذا كنت تريد أن تتخطى الحلقة إدخالاً معينًا، فاختبر ما إذا كان المُكرر يتطابق مع هذا الإدخال واستخدم 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
أمر الاستراحة
ال 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 باستخدام المصفوفات الترابطية
في Bash 4 والإصدارات الأحدث، تسمح لك المصفوفات الترابطية بإنشاء قوائم من أزواج المفتاح والقيمة التي يمكن البحث عنها حسب المفتاح أو حسب القيمة. ونظرًا للعلاقة ثنائية الاتجاه بين المفتاح والقيمة، تُسمى أيضًا قواميس البيانات.
يمكننا التكرار من خلال مجموعة ارتباطية باستخدام for
الحلقة. هذا البرنامج النصي هو “associative.sh”. وهو يحدد مصفوفة ارتباطية تحتوي على أربعة مدخلات، واحدة لكل من “dog” و”cat” و”robin” و”human”. هذه هي المفاتيح. القيم هي عدد الأرجل (الافتراضي) التي يحتوي عليها كل منها.
#!/bin/bashdeclare -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
يجب عليك الحذر من التوسعات غير المتوقعة لأسماء الملفات، ولكن في الحالات البسيطة يكون الأمر جيدًا.
هذا البرنامج النصي هو “command.sh.” وهو يستخدم ls
و wc
لتوفير قائمة مرتبة لأسماء ملفات النصوص، بالإضافة إلى عدد أسطرها، وكلماتها، وبايتاتها.
#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done
عندما نقوم بتشغيله نحصل على الإحصائيات لكل ملف، مع إدراج الملفات حسب الترتيب الأبجدي.
./command.sh
الحلقة المبهرة
ال for
تعد loop أداة برمجة نصية متعددة الاستخدامات وسهلة الفهم. ولكن على الرغم من مرونتها، فلا تنسَ أن الحلقات الأخرى موجودة لسبب ما. لا تنبهر بالتفكير في أن for
الحلقة هي كل ما ستحتاجه.
ال while
على سبيل المثال، تعتبر الحلقة أكثر ملاءمة لأشياء معينة من for
حلقة، مثل قراءة الأسطر من ملف.
كتابة نصوص جيدة تعني استخدام الأداة الأكثر ملاءمة للمهمة المطروحة. for
تعتبر الحلقة أداة رائعة يجب أن تكون ضمن مجموعة أدوات الحيل الخاصة بك.