الصفحة الرئيسية » howto » دليل المبتدئين إلى Scripting 2 من أجل الحلقات

    دليل المبتدئين إلى Scripting 2 من أجل الحلقات

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

    تمت إعادة كتابة البرنامج النصي datecp

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

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

    يتم الفصل بين الوسيطات في shell bash ، وسوف يتم تمييزها عند وجود مسافة في الأمر الموسّع الناتج. في البرنامج النصي الخاص بك, cp $ 1 $ 2. $ date_formatted سيعمل كما هو مقصود طالما أن المتغيرات الموسعة لا تحتوي على مسافات فيها. إذا كنت تتصل بسيناريو الخاص بك بهذه الطريقة: datecp "اسمي القديم" "اسمي الجديد" سيؤدي التوسع إلى هذا الأمر: cp اسمي الجديد الاسم القديم ..the_date والتي لديها بالفعل 6 الحجج.

    لمعالجة هذه المشكلة بشكل صحيح ، يجب أن يكون السطر الأخير من البرنامج النصي: cp "$ 1" "$ 2. $ date_formatted"

    كما ترى ، يمكنك تغيير سطر النص البرمجي من:

    cp -iv $ 1 $ 2. $ date_formatted

    إلى:

    cp -iv "$ 1" "$ 2". $ date_formatted

    سيعتني بهذه المشكلة عند استخدام البرنامج النصي على الملفات التي تحتوي على مسافات في الاسم. يشير صموئيل أيضًا إلى أنه عند التأكد من نسخ الشفرة ولصقها من هذا الموقع (أو الإنترنت بشكل عام) ، يجب التأكد من استبدال الشرط المناسب والاقتباسات الخاصة بالأشكال "المطبّقة طباعيًا" التي تحل محلها. سنقوم أيضًا بعمل المزيد للتأكد من أن الشفرة أكثر سهولة في نسخ / لصق. ؛-)

    قرر معلق آخر ، Myles Braithwaite ، توسيع نطاق البرنامج النصي الخاص بنا بحيث يظهر التاريخ قبل امتداد الملف. لذا بدلا من

    tastyfile.mp3.07_14_11-12.34.56

    سنحصل على هذا:

    tastyfile.07_14_11-12.34.56.mp3

    والتي تصبح أكثر ملاءمة لمعظم المستخدمين. كوده متاح على صفحة GitHub. دعونا نلقي نظرة على ما يستخدمه لفصل اسم الملف.

    date_formatted = $ (date +٪ Y-٪ m-٪ d_٪ H.٪ M٪ S)
    file_extension = $ (صدى "$ 1" | awk -F. 'print $ NF')
    file_name = $ (basename $ 1. $ file_extension)

    cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension

    لقد قمت بتغيير التنسيق قليلاً ، ولكن يمكنك أن ترى أن Myles تعلن وظيفته للتاريخ في السطر 1. في السطر الثاني ، ومع ذلك ، فإنه يستخدم أمر "echo" مع أول وسيطة من البرنامج النصي لإخراج اسم الملف. يستخدم الأمر pipe لأخذ هذا الإخراج واستخدامه كمدخل للجزء التالي. بعد الأنبوب ، يستدعي مايلز أمر "awk" ، وهو برنامج مسح قوي للنمط. باستخدام علامة -F ، فإنه يخبر الأمر بأن الحرف التالي (بعد مسافة) هو ما سيحدد "فاصل المجال". في هذه الحالة ، هذه فترة.

    الآن ، awk رؤية ملف اسمه "tastyfile.mp3" كما تتكون من حقلين: "tastyfile" و "mp3". وأخيرا ، يستخدم

    "print $ NF"

    لعرض الحقل الأخير. إذا كان ملفك يحتوي على فترات متعددة - لذلك ، فسنرى أن awk يرى حقولًا متعددة - سيعرض فقط آخر حقل ، وهو امتداد الملف.

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

    tastyfile.mp3

    وتحويلها إلى

    tastyfile

    ثم في السطر الأخير ، وضع مايلز الأمر الذي سينتج كل شيء بالترتيب. لاحظ أنه لا يوجد مرجع إلى $ 2 ، وسيطة ثانية للنص البرمجي. سينسخ هذا البرنامج النصي الخاص الملف المذكور إلى الدليل الحالي بدلاً منه. وظيفة كبيرة صموئيل و Myles!

    تشغيل البرامج النصية و PATH $

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

    ./النصي

    ~ / بن / النصي

    ولكن ، بوضع نصوصك في ~ / bin / ، يمكنك فقط كتابة أسمائها من أي مكان لجعلها تعمل.

    أمضى المعلقون بعض الوقت في مناقشة مدى ملاءمة ذلك ، حيث لا يقوم توزيعة لينكس حديثة بإنشاء هذا الدليل بشكل افتراضي. علاوة على ذلك ، لا يضيفه أحد إلى متغير PATH $ افتراضيًا ، وهو ما هو المطلوب لكي يتم تشغيل البرامج النصية مثل الأوامر. شعرت بالحيرة بعض الشيء لأن المعلقين كانوا على صواب ، بعد التحقق من متغيري PATH $ ، لكن ما زال العمل بالنصوص النصية مناسبًا لي. لقد اكتشفت السبب: إنشاء العديد من توزيعات Linux الحديثة ملفًا خاصًا في الدليل الرئيسي للمستخدم - .profile.

    تتم قراءة هذا الملف بواسطة bash (ما لم يكن .bash_profile موجودًا في الدليل الرئيسي للمستخدم) وفي الجزء السفلي ، يوجد قسم يضيف المجلد ~ / bin / إلى المتغير PATH $ إذا كان موجودًا. لذلك ، يتم مسح هذا الغموض. بالنسبة لبقية السلسلة ، سأستمر في وضع نصوص برمجية في الدليل ~ / bin / لأنها برامج نصية للمستخدمين ويجب أن تكون قادراً على تشغيلها بواسطة المستخدمين. ويبدو أننا لا نحتاج بالفعل إلى الفوضى مع متغير PATH $ باليد لجعل الأمور تعمل.

    تكرار الأوامر مع الحلقات

    دعونا نصل إلى واحدة من أكثر الأدوات المفيدة في الترسانة المهوسية للتعامل مع المهام المتكررة: الحلقات. اليوم ، سنناقش حلقات "من أجل".

    المخطط الأساسي للحلقة for-loop هو كما يلي:

    لـ VARIABLE في LIST ؛ فعل
    command1
    command2
    ...
    commandn
    فعله

    يمكن أن يكون المتغير VARIABLE أي متغير ، على الرغم من أنه في الغالب يستخدم الحرف الصغير "i" بموجب الاتفاقية. LIST هي قائمة من العناصر ؛ يمكنك تحديد عدة عناصر (فصلها بمسافة) ، أو الإشارة إلى ملف نصي خارجي ، أو استخدام العلامة النجمية (*) للدلالة على أي ملف في الدليل الحالي. يتم وضع بادئة للأوامر الواردة في القائمة ، لذلك من السهل رؤية التعشيش - وضع الحلقات في الحلقات (بحيث يمكنك تكرار الحلقة أثناء التكرار).

    نظرًا لأن القوائم تستخدم مسافات كمحددات - أي مساحة تشير إلى الانتقال إلى العنصر التالي في القائمة - الملفات التي تحتوي على مسافات في الاسم ليست ودية للغاية. الآن ، دعونا نلتزم بالعمل مع الملفات بدون مسافات. لنبدأ بسطر بسيط لعرض أسماء الملفات في الدليل الحالي. قم بإنشاء برنامج نصي جديد في مجلد ~ / bin / الخاص بك بعنوان "loopscript". إذا كنت لا تتذكر كيفية القيام بذلك (بما في ذلك وضع علامة على أنه قابل للتنفيذ وإضافة الاختراق hack bang) ، يرجى الرجوع إلى مقالة bash scripting basics الخاصة بنا.

    في ذلك ، أدخل الرمز التالي:

    لأني في item1 item2 item3 item4 item5 item6؛ فعل
    صدى "$ i"
    فعله

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

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

    لأني في * فعل
    صدى "$ i"
    فعله

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

    الآن ، دعنا نغير أمر الارتداد إلى شيء أكثر فائدة - لنقل ، الأمر zip. وبالتحديد ، سنقوم بإضافة ملفات إلى أرشيف. ودعنا نحصل على بعض الحجج في هذا المزيج!

    لأني في $ @ ؛ فعل
    أرشيف مضغوط "$ i"
    فعله

    هناك شيء جديد! "$ @" هو اختصار لعبارة "$ 1 $ 2 $ 3… $ n". بمعنى آخر ، إنها القائمة الكاملة لجميع الوسائط التي حددتها. الآن ، شاهد ما يحدث عندما أقوم بتشغيل البرنامج النصي مع العديد من ملفات الإدخال.

    يمكنك معرفة أي الملفات موجودة في المجلد الخاص بي. شغّلت الأمر بستة وسيطات ، وتمت إضافة كل ملف إلى أرشيف مضغوط يحمل الاسم "archive.zip". قراءة سهلة?

    للحلقات هي رائعة جدا. الآن يمكنك تنفيذ وظائف الدُفعات في قوائم الملفات. على سبيل المثال ، يمكنك نسخ جميع وسائط النص البرمجي الخاصة بك إلى أرشيف مضغوط ، ونقل النسخ الأصلية إلى مجلد آخر ، وتأمين نسخ هذا الملف المضغوط تلقائيًا إلى كمبيوتر بعيد. إذا قمت بإعداد الملفات الرئيسية باستخدام SSH ، فلن تحتاج حتى إلى إدخال كلمة المرور الخاصة بك ، ويمكنك حتى إخبار البرنامج النصي بحذف الملف المضغوط بعد تحميله!


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

    باش ، هل لديك أي اقتراحات؟ هل قمت بعمل برنامج نصي مفيد يستخدم الحلقات؟ هل تريد مشاركتك الأفكار في المسلسل؟ ترك بعض التعليقات ومساعدة نوبي البرمجة النصية الأخرى بها!