Sami Remili نشر 16 أغسطس 2020 أرسل تقرير نشر 16 أغسطس 2020 سلام عليكم هل احد يشرح لي الكود قطعة قطعة بارك الله فيكم و هو كالاتي : #!/bin/bash n=0 command=$1 while ! $command && [ $n -le 5 ]; do sleep $n ((n=n+1)) echo "Retry #$n" done; اقتباس
0 مصطفى القباني نشر 16 أغسطس 2020 أرسل تقرير نشر 16 أغسطس 2020 تحياتي السطر الأول: #!/bin/bash تعرف العلامة #! باسم ال'shabang' وتستخدم في أنظمة التشغيل linux لتحديد البرنامج الذي سيقوم بتشغيل الscript، ويتم تمرير الscript كمدخلات إلى هذا البرنامج. في هذه الحالة عند تشغيل الملف الذي لدينا، سيقوم نظام التشغيل بإستخدام /bin/bash وإعطاء الكود الموجود في الscript كinput لهذا البرنامج. ومثلاً إذا كان الshabang متبوعاً ب/bin/python سيقوم نظام التشغيل بتشغيل الscript داخل بايثون. n=0 تم تعريف متغير n ومساوته بالصفر. command=$1 يعرف $1 باسم الpositional parameters وهو ما تم تمريره إلى السكريبت، وهو مشابه لsys.argv في بايثون. على سبيل المثال إذا كان لديك script بهذا الشكل واسمها script.sh: command=$1 command2=$2 echo $command echo $command2 وقمت بإستدعاءها كالآتي: script.sh arg1 arg2 سيتم طباعة arg1 arg2 وهو ما تم تمريرهم إلى الscript. بالتالي في الكود الخاص بك قمنا بوضع أول قيمة تم تمريرها عند إستدعاء الscript في المتغير command. while ! $command && [ $n -le 5 ]; do يتم عمل loop تقوم بالإستمرار في حالتين، لفهم الحالتين يجب توضيح الآتي: ! $command عند كتابة ! متبوعاً بأمر، يتم تنفيذ آخر أمر تم تنفيذه من الhistory. مثلا: !ls سيقوم بتنفيذ آخر أمر ls موجود بالhistory. أيضاً هناك نقطة هامة لفهم عمل الloop، وهو في نظام تشغيل لينكس، الأمر الناجح يقوم بإرجاع القيمة 0 ، بينما الأمر الغير ناجح يرجع قيمة لا تساوي الصفر. لذلك عند إستخدام أمر ما كشرط في الloop، فإن الloop يتم الخروج منها عند تنفيذ الأمر بنجاح، بينما تستمر الloop إذا كان الأمر غير ناجح. [ $n -le 5 ] هنا le تعني less than or equal، أي أن الشرط هنا أن تكون n أقل من أو تساوي 5. sleep $n ((n=n+1)) echo "Retry #$n" done; الأمر sleep يقوم بعمل إنتظار لعدد معين من الثواني. إذا الكود ككل يقوم بعمل الآتي: يتم تمرير أمر ما إلى الscript، ويتم تخزين هذا الأمر في متغير يدعى command، ويتم تعريف متغير n ومساوته بالصفر. ثم يتم عمل loop يتم الخروج منها إذا تم تنفيذ الأمر بنجاح، ويتم الإستمرار فيها بينما الأمر به خطأ وn أقل من أول تساوي 5. وفي اللوب يتم التأخير بعدد n من الثواني ، ثم زيادة n، وطباعة الجملة Retry. 2 اقتباس
0 Sami Remili نشر 16 أغسطس 2020 الكاتب أرسل تقرير نشر 16 أغسطس 2020 بتاريخ 9 ساعات قال مصطفى القباني: تحياتي السطر الأول: #!/bin/bash تعرف العلامة #! باسم ال'shabang' وتستخدم في أنظمة التشغيل linux لتحديد البرنامج الذي سيقوم بتشغيل الscript، ويتم تمرير الscript كمدخلات إلى هذا البرنامج. في هذه الحالة عند تشغيل الملف الذي لدينا، سيقوم نظام التشغيل بإستخدام /bin/bash وإعطاء الكود الموجود في الscript كinput لهذا البرنامج. ومثلاً إذا كان الshabang متبوعاً ب/bin/python سيقوم نظام التشغيل بتشغيل الscript داخل بايثون. n=0 تم تعريف متغير n ومساوته بالصفر. command=$1 يعرف $1 باسم الpositional parameters وهو ما تم تمريره إلى السكريبت، وهو مشابه لsys.argv في بايثون. على سبيل المثال إذا كان لديك script بهذا الشكل واسمها script.sh: command=$1 command2=$2 echo $command echo $command2 وقمت بإستدعاءها كالآتي: script.sh arg1 arg2 سيتم طباعة arg1 arg2 وهو ما تم تمريرهم إلى الscript. بالتالي في الكود الخاص بك قمنا بوضع أول قيمة تم تمريرها عند إستدعاء الscript في المتغير command. while ! $command && [ $n -le 5 ]; do يتم عمل loop تقوم بالإستمرار في حالتين، لفهم الحالتين يجب توضيح الآتي: ! $command عند كتابة ! متبوعاً بأمر، يتم تنفيذ آخر أمر تم تنفيذه من الhistory. مثلا: !ls سيقوم بتنفيذ آخر أمر ls موجود بالhistory. أيضاً هناك نقطة هامة لفهم عمل الloop، وهو في نظام تشغيل لينكس، الأمر الناجح يقوم بإرجاع القيمة 0 ، بينما الأمر الغير ناجح يرجع قيمة لا تساوي الصفر. لذلك عند إستخدام أمر ما كشرط في الloop، فإن الloop يتم الخروج منها عند تنفيذ الأمر بنجاح، بينما تستمر الloop إذا كان الأمر غير ناجح. [ $n -le 5 ] هنا le تعني less than or equal، أي أن الشرط هنا أن تكون n أقل من أو تساوي 5. sleep $n ((n=n+1)) echo "Retry #$n" done; الأمر sleep يقوم بعمل إنتظار لعدد معين من الثواني. إذا الكود ككل يقوم بعمل الآتي: يتم تمرير أمر ما إلى الscript، ويتم تخزين هذا الأمر في متغير يدعى command، ويتم تعريف متغير n ومساوته بالصفر. ثم يتم عمل loop يتم الخروج منها إذا تم تنفيذ الأمر بنجاح، ويتم الإستمرار فيها بينما الأمر به خطأ وn أقل من أول تساوي 5. وفي اللوب يتم التأخير بعدد n من الثواني ، ثم زيادة n، وطباعة الجملة Retry. شكرا أحي على الشرح لكن مازال لبس في ما يخص sys.argv او command=$1 ماهي فائدة استعماله ارجو اجابة و شرح 1 اقتباس
0 مصطفى القباني نشر 17 أغسطس 2020 أرسل تقرير نشر 17 أغسطس 2020 بتاريخ 9 ساعات قال Sami Remili: شكرا أحي على الشرح لكن مازال لبس في ما يخص sys.argv او command=$1 ماهي فائدة استعماله ارجو اجابة و شرح بالنسبة ل sys.argv يمكنك فهم ما تقوم بعمله من خلال الجزء الأول من هذا الرد. و $1 هنا هو نفس الإستخدام بالنسبة للbash script. هذه هي طريقة الوصول إلى ما تم تمريره من مدخلات عند إستدعاء الscript. فمثلاً إذا أردت عمل script تقوم بتعديل اسم ملف، وتريد أن تستخدمها بأن تستدعيها وتمرر لها اسم الملف القديم واسم الملف الجديد، أي أنك تريد إستدعائها كالآتي: rename.sh old_name new_name هنا تم تمرير old_name وnew_name للسكريبت، وعند كتابة الكود للوصول إليهم يمكن الوصول إليهم كالآتي: x = $1 y = $2 وسيكون قيمة x مساوية لأول مدخل معطى للسكريبت أي سيكون "old_name" وستكون قيمة y مساوية للمعطى الثاني وهو new_name. اقتباس
السؤال
Sami Remili
سلام عليكم
هل احد يشرح لي الكود قطعة قطعة بارك الله فيكم و هو كالاتي :
#!/bin/bash
n=0
command=$1
while ! $command && [ $n -le 5 ]; do
sleep $n
((n=n+1))
echo "Retry #$n"
done;
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.