إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

شرح for loops

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • شرح for loops

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

    أولا- صيغة اﻷمر:
    كود:
    for i in `SOME VALUE`; do SOME PROCESS $i; done
    ثانيا- تفسير الصيغة:
    المقطع اﻷول من اﻷمر
    for i in `SOME VALUE`
    هو مخزن القيمة التي سوف تستدعى و تدخل في العملية الثانية (القيمة نفسها تكون ناتج عملية).

    المقطع الثاني
    do SOME PROCESS $i
    هو الذي يستدعي القيمة المخزنة في المقطع الأول و ينفيذ العملية المطلوبة.

    ثالثا- بالمثال يتضح المقال:
    كود:
    for i in `ls` ; do echo $i ; done
    في هذا المثال قمنا باعطاء الحرف i مخرجات اﻷمر ls كقيم له ، وقمنا بعد ذلك باستدعاء القيم المخزنة داخل i والمعبر عنها ب $i لتنفيذ أمر echo عليها واحدة بعد اﻷخرى.

    رابعا أمثلة عملية :
    أنشئ ملف text file
    و ضع داخل الملف:
    islamway.com
    linuxac.org
    google.com
    gnu.org
    cnn.com
    مثلا و ليكن كل نطاق منهم في سطر مستقل و أطلق عليه اسم domains.txt مثلا ، ونفذ :
    كود:
    for i in `cat domains.txt` ; do ping -c5 $i ; done
    و هذا مهم لمدراء النظم و لأصحاب شركات اﻹستضافة ،لو جمع ألف نطاق في ملف واحد يمكنه أن يتابعهم بكل سهولة بأمر واحد فقط.

    جرب هذا أيضا :
    كود:
    for i in `seq 9` ; do wget http://download.quranicaudio.com/quran/abu_bakr_ash-shaatree/00$i.mp3; done
    هذا سوف يقوم باستخدام wget لتحميل أول 9 سور من القرءان الكريم بصوت الشيخ الشاطري.
    ويلاحظ أنه ليس من الضروري أن تعبر عن القيم ب i و $i ممكن أن تستبدلهم بما يحلو لك من الحروف ، ويلاحظ أنه من الممكن أن تستخدم ال command chaining و redirection ، مثال :
    كود:
    for m in `ps -e | grep firefox | awk {' print $1 '}` ; do echo $m && kill -9 $m ; done >>pid.log
    هذا سوف يقوم بإظهار رقم العملية وانهائها وتحويل مخرج اﻷمر الى الملف الذي قمت بتحديده، وفي هذه الحالة سوف يغلق متصفحك.

    *يلاحظ أنه من الممكن استتبدال``ب $() ، مثال:

    بدلا من كتابة
    كود:
    for i in `ls` ; do echo $i ; done
    يمكنك أن تكتب
    كود:
    for i in $(ls) ; do echo $i ; done
    و يلاحظ أيضا أنه ليس من الضروري أن تكون القيمة المخزنة في المقطع اﻷول من اﻷمر هي نتيجة أمر (,seq,ls,cat,.....) ، بل من الممكن أن تدخل أنت بيدك القيم التي سوف تستدعيها فيما بعد ، مثال:
    كود:
    for i in red green blue; do touch file_$i; done
    أو
    كود:
    for i in *.jpg; do stat $i; done
    مثلا .*

    أرجوا أن أكون قد أفدتكم ولو بالقليل .
    تحياتي للجميع
    التعديل الأخير تم بواسطة abo_salmaan; الساعة 13-04-2008, 07:58 AM. سبب آخر: تكملة

  • #2
    شرح جميل ورائع
    لكن أريد منك إضافة ما يلي
    كود:
    for i in 1 2 3 4; do echo "$i"; done
    
    for i in $(seq 1 10); do echo $i; done
    
    for i in red green blue; do echo "$i"; done
    
    for i in *.jpeg; do echo "file [$i]"; done
    
    for i in *.jpg; do mv "$i" "${i/jpg/jpeg}"; done
    
    for (( i=0; i<=10; i++ )); do
    echo "f($i) = x^2-4 = $(( i*i - 4 ))"
    done

    تعليق


    • #3
      شكر و تقدير

      السلام عليك أستاذي الفاضل......
      أولا أشكرك ﻷنك أول من شرفني بالرد على أول شرح لي بالمنتدى،
      ثانيا أشكرك على افادتك و تكميلك لنقص موضوعنا المتواضع،
      و أسأل الله أن يمتعنا بوجودك بيننا بالمنتدى.
      مشكور أ / مؤيد .

      تعليق


      • #4
        الآن دورك تشرح الطلاسم التي كتبناها

        هناك 6 صيف في المشاركة التي بعثتها أنا

        أضفها لشرحك

        ملاحظة `` هي نفسها $()

        تعليق


        • #5
          السلام عليكم . .

          بصراحة . . لم أفهم شيئا مما كتب في اﻷعلى،
          فحبذا لو توضحون ماذا تفعلون ^_^

          kaf-laarous

          " إذا كنت تصدق كل ما تقرأ، لا تقرأ !"

          [مدونة kaf-laarous]


          G+ || Facebook || twitter

          تعليق


          • #6
            أستاذي الفاضل ، قد قمت ببعض التعديلات بناء على ارشادك ، ووضعتها بين ** ، فنرجوا منكم تصويب الخطأ وتكملة النقص.
            بالنسبة ل
            for i in *.jpg; do mv "$i" "${i/jpg/jpeg}"; done
            و
            for (( i=0; i<=10; i++ )); do
            echo "f($i) = x^2-4 = $(( i*i - 4 ))"
            done
            فأنا ان كنت قد رأيت نتيجتهم ولكن لم أستطع تفسيرهم بشكل مقنع ، برجاء توضيحهم لنا مشكورا مأجورا.

            تعليق


            • #7
              المشاركة الأصلية بواسطة kaf-laarous مشاهدة المشاركة
              السلام عليكم . .

              بصراحة . . لم أفهم شيئا مما كتب في اﻷعلى،
              فحبذا لو توضحون ماذا تفعلون ^_^

              kaf-laarous
              وعليكم السلام ورحمة الله وبركاته......
              أهلا بك أخي الحبيب ،
              قم بتنفيذ اﻷمثلة من البداية و اذا احتجت أي توضيح بعد ذلك أنا في خدمتك.

              تعليق


              • #8
                فأنا ان كنت قد رأيت نتيجتهم ولكن لم أستطع تفسيرهم بشكل مقنع ، برجاء توضيحهم لنا مشكورا مأجورا.
                بسيطة،
                صيغة for هي
                for i in LIST; done COMMAND; done
                حيث LIST هي مجموعة من القيم
                و COMMAND هو الأمر المطلوب تنفيذه

                أسهل مثال عليها هو
                كود:
                for i in red green blue; do echo "$i"; done
                حيث تدور قيمة i على القيم red و green و blue

                لاحظ أنه ليس بالضرورة أن نكتب هذه القيم حيث يمكن استعمال مخرجات أمر مثل seq 1 100 الذي يعد من 1 إلى 100
                وذلك بعلامة ` أو باستخدام تعويض المخرجات $ متبوعة بأمر بين قوسين

                كود:
                for i in $(seq 1 10); do echo $i; done
                لعمل حلقة على أسطر ملف اسخدم الأمر cat ثم اسم الملف
                كما فعل أبو سلمان في
                كود:
                for i in $( cat domains.txt ) ; do ping -c5 $i ; done
                الطريقة الأخرى هي استخدام ال globing
                يعني الطلب من bash تعويض أسماء ملفات بواسطة نوذج نستفيد فيه من * و ? و [ ] ...
                كأن نقول
                كود:
                for i in *.jpg; do echo "$i" ;done
                حيث يقوم bash بتعويض أسماء الملفات المنتهية ب .jpg بعد in

                أما

                كود:
                for i in *.jpg; do mv "$i" "${i/jpg/jpeg}"; done
                فهي تغير اسمه الملفات المنتهية ب jpg إلى jpeg
                وذلك بعمل تعويض للمتغير i مع استبدال jpg ب jpeg

                أما المثال الأخير فهو استعمال صيغة مشابهة للغة سي
                كود:
                for (( i=0; i<=10; i++ ))
                أي يعد من 0 إلى 10

                وفي كل مرة يطبع
                كود:
                echo "f($i) = x^2-4 = $(( i*i - 4 ))"
                أما $ ثم قوسان فهو رمز تعويض نتيجة عملية الحسابية

                تعليق


                • #9
                  جزاك الله كل خير أ / مؤيد على الاهتمام و التوضيح ،
                  أسأل الله أن يزيدك علما.

                  تعليق

                  يعمل...
                  X