الفرق بين المراجعتين لصفحة: «Bash/for loop»
أسامه-دمراني (نقاش | مساهمات) إضافة: إدخال 1.0 عنوان الصفحة |
أسامه-دمراني (نقاش | مساهمات) مراجعة 6: إضافة التصانيف وتعديل اسم مستخدم الطرفية |
||
(6 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:حلقة for في Bash}}</noinclude> | <noinclude>{{DISPLAYTITLE:حلقة for في Bash}}</noinclude> | ||
== كيفية عمل حلقة for التكرارية == | |||
حلقة for هي أول وحدة تكرارية في الصدفة من بين ثلاث وحدات، وتسمح تلك الحلقة بتخصيص قائمة من القِيَم، وتُنفَّذ قائمة من الأوامر لكل قيمة من تلك القيم. | |||
والبنية اللغوية لهذه الحلقة التكرارية هي كالآتي:<syntaxhighlight lang="bash"> | |||
for NAME [in LIST ]; do COMMANDS; done | |||
</syntaxhighlight>إن لم تكن <code>[ in LIST]</code> موجودة فيتم استبدال <code>@$ in</code> بها، وتنفذ <code>for</code> الأوامر (<code>COMMANDS</code>) مرة واحدة لكل معامل موضعي مضبوط على قيمة، انظر [[Bash/variables|المتغيرات في Bash]] و<nowiki/>[[Bash/more advanced if usage#.D9.81.D8.AD.D8.B5 .D9.88.D8.B3.D8.A7.D8.A6.D8.B7 .D8.B3.D8.B7.D8.B1 .D8.A7.D9.84.D8.A3.D9.88.D8.A7.D9.85.D8.B1|فحص وسائط سطر الأوامر]]<nowiki/>. | |||
وتكون حالة الإعادة (return status) هي حالة الخروج لآخِر أمر يُنفّذ، وإن لم يُنفذ أي أمر بسبب أن <code>LIST</code> لا تتوسع إلى أي عنصر فإن حالة الإعادة هي صفر. | |||
ويمكن أن يكون الاسم (<code>NAME</code>) أي اسم لمتغير رغم أن <code>i</code> تستخدم كثيرًا، وكذلك يمكن أن تكون قائمة (<code>LIST</code>) مكونة من أي كلمات أو نصوص أو أرقام، والتي قد تكون حرفية أو مولَّدة بواسطة أي أمر. | |||
وبالمثل فإن الأوامر التي يجب تنفيذها لكل قيمة (<code>COMMANDS</code>) يمكن أن تكون أي أوامر للنظام أو برامج أو عبارات للصدفة (shell statement) أو برامج للصدفة (scripts) أيضًا. وعند بدء أول دورة في الحلقة يُضبط متغير <code>NAME</code> في أول مرة على أول عنصر في قائمة <code>LIST</code>، ثم تتغير قيمته في المرة الثانية إلى ثاني عنصر في القائمة، وهكذا. تنتهي الحلقة التكرارية حين ينتهي متغير <code>NAME</code> من المرور على كل القيم في القائمة. | |||
== أمثلة == | |||
=== استخدام استبدال الأوامر لتحديد عناصر القائمة === | |||
سيكون أول مثال على سطر الأوامر، حيث يعرض استخدام حلقةُ <code>for</code> لإنشاء نسخة احتياطية من كل ملف <code>xml.</code>، ويمكنك العمل على مصادرك بأمان بعد إصدار الأمر:<syntaxhighlight lang="bash"> | |||
[wiki@hsoub ~/articles] ls *.xml | |||
file1.xml file2.xml file3.xml | |||
[wiki@hsoub ~/articles] ls *.xml > list | |||
[wiki@hsoub ~/articles] for i in `cat list`; do cp "$i" "$i".bak ; done | |||
[wiki@hsoub ~/articles] ls *.xml* | |||
file1.xml file1.xml.bak file2.xml file2.xml.bak file3.xml file3.xml.bak | |||
</syntaxhighlight>أما هذا المثال فيعرض ملفات النصوص العادية والتي يحتمل أن تكون برامج، داخل مجلد <code>sbin/</code> :<syntaxhighlight lang="bash"> | |||
for i in `ls /sbin`; do file /sbin/$i | grep ASCII; done | |||
</syntaxhighlight> | |||
=== استخدام محتوى المتغير لتحديد عناصر القائمة === | |||
ما يلي هو برنامج محدد يحوّل ملفات HTML متوافقة مع نظام ما إلى ملفات PHP، ويتم التحويل بحذف أول 25 سطر وآخر 21، ووضع وسمين من PHP يضيفان سطري ترويسة وتذييل:<syntaxhighlight lang="bash"> | |||
[wiki@hsoub ~/html] cat html2php.sh | |||
#!/bin/bash | |||
# php إلى html برنامج محدد لتحويل ملفات | |||
LIST="$(ls *.html)" | |||
for i in "$LIST"; do | |||
NEWNAME=$(ls "$i" | sed -e 's/html/php/') | |||
cat beginfile > "$NEWNAME" | |||
cat "$i" | sed -e '1,25d' | tac | sed -e '1,21d'| tac >> "$NEWNAME" | |||
cat endfile >> "$NEWNAME" | |||
done | |||
</syntaxhighlight>ولا توجد طريقة لمعرفة رقم السطر الذي سيبدأ الحذف عنده إلا عند الوصول للنهاية لأننا لا نعُدّ الأسطر هنا، وتُحل المشكلة باستخدام <code>tac</code> حيث يعكس الأسطر داخل الملف. | |||
'''أمر basename''' | |||
من الأفضل استخدام أمر <code>basename</code> لتغيير لاحقة html إلى php. انظر صفحات دليل <code>man</code> لهذا الأمر للمزيد من التفصيل. | |||
'''المحارف الشاذة''' | |||
ستطرأ لديك مشاكل إن توسعت القائمة إلى أسماء ملفات بها محارف خاصة مثل المسافات وغيرها من المحارف الشاذة، والحل هنا أن تستخدم خاصية التدوير (globbing) في الصدفة كما يلي:<syntaxhighlight lang="bash"> | |||
for i in $PATHNAME/*; do | |||
commands | |||
done | |||
</syntaxhighlight> | |||
== انظر أيضًا == | |||
* [[Bash/debugging Bash scripts|تنقيح برامج Bash]]. | |||
* [[Bash/shell expansion|التوسعات في Bash]]. | |||
* [[Bash/examples using grep|أمثلة عن استخدام grep]]. | |||
== مصادر == | |||
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_01.html دليل Bash للمبتدئين. صفحة حلقة for التكرارية]. | |||
[[تصنيف:Bash]] | |||
[[تصنيف:Bash For Loop]] | |||
[[تصنيف:Bash Loops]] |
المراجعة الحالية بتاريخ 00:31، 7 سبتمبر 2018
كيفية عمل حلقة for التكرارية
حلقة for هي أول وحدة تكرارية في الصدفة من بين ثلاث وحدات، وتسمح تلك الحلقة بتخصيص قائمة من القِيَم، وتُنفَّذ قائمة من الأوامر لكل قيمة من تلك القيم.
والبنية اللغوية لهذه الحلقة التكرارية هي كالآتي:
for NAME [in LIST ]; do COMMANDS; done
إن لم تكن [ in LIST]
موجودة فيتم استبدال @$ in
بها، وتنفذ for
الأوامر (COMMANDS
) مرة واحدة لكل معامل موضعي مضبوط على قيمة، انظر المتغيرات في Bash وفحص وسائط سطر الأوامر.
وتكون حالة الإعادة (return status) هي حالة الخروج لآخِر أمر يُنفّذ، وإن لم يُنفذ أي أمر بسبب أن LIST
لا تتوسع إلى أي عنصر فإن حالة الإعادة هي صفر.
ويمكن أن يكون الاسم (NAME
) أي اسم لمتغير رغم أن i
تستخدم كثيرًا، وكذلك يمكن أن تكون قائمة (LIST
) مكونة من أي كلمات أو نصوص أو أرقام، والتي قد تكون حرفية أو مولَّدة بواسطة أي أمر.
وبالمثل فإن الأوامر التي يجب تنفيذها لكل قيمة (COMMANDS
) يمكن أن تكون أي أوامر للنظام أو برامج أو عبارات للصدفة (shell statement) أو برامج للصدفة (scripts) أيضًا. وعند بدء أول دورة في الحلقة يُضبط متغير NAME
في أول مرة على أول عنصر في قائمة LIST
، ثم تتغير قيمته في المرة الثانية إلى ثاني عنصر في القائمة، وهكذا. تنتهي الحلقة التكرارية حين ينتهي متغير NAME
من المرور على كل القيم في القائمة.
أمثلة
استخدام استبدال الأوامر لتحديد عناصر القائمة
سيكون أول مثال على سطر الأوامر، حيث يعرض استخدام حلقةُ for
لإنشاء نسخة احتياطية من كل ملف xml.
، ويمكنك العمل على مصادرك بأمان بعد إصدار الأمر:
[wiki@hsoub ~/articles] ls *.xml
file1.xml file2.xml file3.xml
[wiki@hsoub ~/articles] ls *.xml > list
[wiki@hsoub ~/articles] for i in `cat list`; do cp "$i" "$i".bak ; done
[wiki@hsoub ~/articles] ls *.xml*
file1.xml file1.xml.bak file2.xml file2.xml.bak file3.xml file3.xml.bak
أما هذا المثال فيعرض ملفات النصوص العادية والتي يحتمل أن تكون برامج، داخل مجلد sbin/
:
for i in `ls /sbin`; do file /sbin/$i | grep ASCII; done
استخدام محتوى المتغير لتحديد عناصر القائمة
ما يلي هو برنامج محدد يحوّل ملفات HTML متوافقة مع نظام ما إلى ملفات PHP، ويتم التحويل بحذف أول 25 سطر وآخر 21، ووضع وسمين من PHP يضيفان سطري ترويسة وتذييل:
[wiki@hsoub ~/html] cat html2php.sh
#!/bin/bash
# php إلى html برنامج محدد لتحويل ملفات
LIST="$(ls *.html)"
for i in "$LIST"; do
NEWNAME=$(ls "$i" | sed -e 's/html/php/')
cat beginfile > "$NEWNAME"
cat "$i" | sed -e '1,25d' | tac | sed -e '1,21d'| tac >> "$NEWNAME"
cat endfile >> "$NEWNAME"
done
ولا توجد طريقة لمعرفة رقم السطر الذي سيبدأ الحذف عنده إلا عند الوصول للنهاية لأننا لا نعُدّ الأسطر هنا، وتُحل المشكلة باستخدام tac
حيث يعكس الأسطر داخل الملف.
أمر basename
من الأفضل استخدام أمر basename
لتغيير لاحقة html إلى php. انظر صفحات دليل man
لهذا الأمر للمزيد من التفصيل.
المحارف الشاذة
ستطرأ لديك مشاكل إن توسعت القائمة إلى أسماء ملفات بها محارف خاصة مثل المسافات وغيرها من المحارف الشاذة، والحل هنا أن تستخدم خاصية التدوير (globbing) في الصدفة كما يلي:
for i in $PATHNAME/*; do
commands
done