मुखपृष्ठ » कैसे » लूप्स के लिए शेल स्क्रिप्टिंग 2 के लिए शुरुआती गाइड

    लूप्स के लिए शेल स्क्रिप्टिंग 2 के लिए शुरुआती गाइड

    यदि आप अपना geek क्रेडिट बनाना चाहते हैं, तो हमारी शेल स्क्रिप्टिंग श्रृंखला में दूसरी किस्त के लिए हमसे जुड़ें। हमारे पास कुछ सुधार हैं, पिछले सप्ताह की पटकथा में कुछ सुधार हैं, और निर्जन के लिए लूपिंग पर एक गाइड है.

    डेटकप स्क्रिप्ट पुनरीक्षित

    हमारे शेल स्क्रिप्टिंग गाइड की पहली किस्त में, हमने एक स्क्रिप्ट बनाई जिसमें फ़ाइल नाम को फ़ाइल नाम के अंत में संलग्न करने के बाद एक बैकअप निर्देशिका में कॉपी किया गया.

    सैमुअल डायने-रील ने टिप्पणियों में बताया कि हमारे चर संदर्भों को संभालने के लिए एक बेहतर तरीका है.

    तर्क बैश शेल में जगह-अलग हो जाते हैं, यह टोकन तब होगा जब परिणामी विस्तारित कमांड में एक स्थान होगा। आपकी स्क्रिप्ट में, cp $ 1 $ 2. $ date_formatted तब तक काम करेगा जब तक कि विस्तारित चर उन में स्थान नहीं रखते। यदि आप अपनी स्क्रिप्ट को इस तरह कहते हैं: datecp "मेरा पुराना नाम" "मेरा नया नाम" विस्तार इस आदेश में परिणाम होगा: cp मेरा नया नाम my old name.the_date जिसमें वास्तव में 6 तर्क हैं.

    इस समस्या को ठीक से संबोधित करने के लिए, स्क्रिप्ट की अंतिम पंक्ति होनी चाहिए: cp "$ 1" "$ 2. $ date_formatted"

    जैसा कि आप देख सकते हैं, हमारी स्क्रिप्ट की लाइन को निम्न से बदलना:

    cp -iv $ 1 $ 2. $ date_formatted

    सेवा मेरे:

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

    नाम में रिक्त स्थान वाली फ़ाइलों पर स्क्रिप्ट का उपयोग करते समय इस समस्या का ध्यान रखेंगे। सैमुअल ने यह भी कहा कि इस साइट (या सामान्य रूप से इंटरनेट) से कोड को कॉपी और पेस्ट करते समय "टाइपोग्राफिक रूप से बेहतर" लोगों के लिए उचित डैश और उद्धरण का चयन करना सुनिश्चित करें जो अक्सर उन्हें प्रतिस्थापित करते हैं। हम यह सुनिश्चित करने के लिए भी अधिक काम करेंगे कि हमारा कोड अधिक कॉपी / पेस्ट फ्रेंडली हो। ;-)

    एक अन्य टिप्पणीकार, माइल्स ब्रेथवेट ने हमारी स्क्रिप्ट का विस्तार करने का फैसला किया, ताकि फ़ाइल एक्सटेंशन से पहले तारीख दिखाई दे। इसलिए इसके बजाय

    tastyfile.mp3.07_14_11-12.34.56

    हमें यह मिलेगा:

    tastyfile.07_14_11-12.34.56.mp3

    जो अधिकांश उपयोगकर्ताओं के लिए थोड़ा अधिक सुविधाजनक होता है। उसका कोड उसके GitHub पेज पर उपलब्ध है। आइए एक नज़र डालते हैं कि वह फाइलनाम के अलावा क्या खींचता है.

    date_formatted = $ (दिनांक +% Y-% m-% d_% H.% M% S)
    file_extension = $ (गूंज "$ 1" | awk -F। 'प्रिंट $ NF')
    file_name = $ (बेसन $ 1। $ file_extension)

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

    मैंने स्वरूपण को थोड़ा बदल दिया है, लेकिन आप देख सकते हैं कि Myles लाइन 1 में अपनी तिथि फ़ंक्शन की घोषणा करता है। हालांकि लाइन 2 में, वह फ़ाइल के नाम को आउटपुट करने के लिए स्क्रिप्ट के पहले तर्क के साथ "इको" कमांड का उपयोग करता है। वह उस आउटपुट को लेने के लिए पाइप कमांड का उपयोग करता है और अगले भाग के लिए इनपुट के रूप में उपयोग करता है। पाइप के बाद, माइल्स "awk" कमांड पर कॉल करता है, जो एक शक्तिशाली पैटर्न स्कैनिंग प्रोग्राम है। -F ध्वज का उपयोग करते हुए, वह कमांड को बता रहा है कि अगला वर्ण (एक स्थान के बाद) वह है जो "फ़ील्ड विभाजक" को परिभाषित करेगा। इस मामले में, यह एक अवधि है.

    अब, awk को "deliciousfile.mp3" नामक एक फ़ाइल दिखाई दे रही है, जो दो क्षेत्रों से बना है: "स्वादिष्ट" और "एमपी 3"। अंत में, वह उपयोग करता है

    'प्रिंट $ एनएफ'

    अंतिम फ़ील्ड प्रदर्शित करने के लिए। यदि आपकी फ़ाइल में कई अवधियाँ हैं - इसलिए awk बनाना कई क्षेत्रों को देखता है - यह केवल पिछले एक को प्रदर्शित करेगा, जो फ़ाइल एक्सटेंशन है.

    पंक्ति 3 में, वह फ़ाइल के नाम के लिए एक नया चर बनाता है और $ 1 में सब कुछ संदर्भ के लिए "बेसनेम" कमांड का उपयोग करता है के सिवाय फ़ाइल एक्सटेंशन। यह बेसनेम का उपयोग करके और $ 1 को इसके तर्क के रूप में दिया जाता है, फिर एक स्थान और फ़ाइल एक्सटेंशन जोड़ते हैं। चर के संदर्भ में फ़ाइल एक्सटेंशन स्वचालित रूप से जुड़ जाता है जो लाइन 2 को संदर्भित करता है। यह क्या करेगा

    tastyfile.mp3

    और इसे चालू करें

    tastyfile

    फिर अंतिम पंक्ति में, माइल्स ने कमांड को एक साथ रखा जो क्रम में सब कुछ आउटपुट करेगा। ध्यान दें कि स्क्रिप्ट का दूसरा तर्क $ 2 का कोई संदर्भ नहीं है। यह विशेष स्क्रिप्ट उक्त फ़ाइल को आपकी वर्तमान निर्देशिका में कॉपी करेगी। महान काम सैमुअल और माइल्स!

    रनिंग लिपियों और $ PATH

    हम अपने मूल बातें लेख में भी उल्लेख करते हैं कि स्क्रिप्ट को डिफ़ॉल्ट रूप से आदेश के रूप में संदर्भित करने की अनुमति नहीं है। यही है, आपको इसे चलाने के लिए स्क्रिप्ट के पथ को इंगित करना होगा:

    ./ लिपि

    ~ / Bin / स्क्रिप्ट

    लेकिन, ~ / bin / में अपनी स्क्रिप्ट्स रखकर, आप उन्हें चलाने के लिए कहीं से भी उनके नाम टाइप कर सकते हैं.

    टिप्पणीकारों ने कुछ समय यह बहस करने में बिताया कि यह कितना उचित है, क्योंकि कोई भी आधुनिक लिनक्स डिस्ट्रो डिफ़ॉल्ट रूप से उस निर्देशिका को नहीं बनाता है। इसके अलावा, कोई भी इसे डिफ़ॉल्ट रूप से $ PATH वैरिएबल में नहीं जोड़ता है, जो कि स्क्रिप्ट की तरह कमांड चलाने के लिए आवश्यक है। मैं थोड़ा हैरान था क्योंकि मेरे $ PATH चर की जाँच करने के बाद, टिप्पणीकार सही थे, लेकिन कॉलिंग स्क्रिप्ट अभी भी मेरे लिए काम कर रही थी। मुझे पता चला कि क्यों: कई आधुनिक लिनक्स डिस्ट्रोस उपयोगकर्ता के होम डायरेक्टरी में एक विशेष फ़ाइल बनाते हैं - .profile.

    यह फ़ाइल bash द्वारा पढ़ी जाती है (जब तक कि .bash_profile उपयोगकर्ता के होम डायरेक्टरी में मौजूद नहीं होती है) और सबसे नीचे, एक खंड होता है जो $ PATH वैरिएबल में ~ / बिन / फ़ोल्डर जोड़ता है यदि यह मौजूद है तो, उस रहस्य को साफ कर दिया गया है। श्रृंखला के बाकी हिस्सों के लिए, मैं स्क्रिप्ट्स को ~ / बिन / निर्देशिका में जारी रखूंगा क्योंकि वे उपयोगकर्ता स्क्रिप्ट हैं और उन्हें उपयोगकर्ताओं द्वारा चलाया जा सकता है। और, ऐसा लगता है कि हमें काम करने के लिए वास्तव में $ PATH चर के साथ गड़बड़ करने की आवश्यकता नहीं है.

    लूप्स के साथ दोहराते हुए कमांड

    आइए दोहराए जाने वाले कार्यों से निपटने के लिए गीक शस्त्रागार में सबसे उपयोगी उपकरणों में से एक को प्राप्त करें: लूप्स। आज, हम "छोरों" के लिए चर्चा करेंगे.

    एक लूप की मूल रूपरेखा इस प्रकार है:

    लिस्ट में वार्ले के लिए; करना
    command1
    command2
    ...
    commandn
    किया हुआ

    वार्बल किसी भी चर हो सकता है, हालांकि सबसे कम बार "मैं" सम्मेलन द्वारा उपयोग किया जाता है। लिस्ट वस्तुओं की एक सूची है; आप कई आइटम्स निर्दिष्ट कर सकते हैं (उन्हें किसी स्थान से अलग कर सकते हैं), किसी बाहरी टेक्स्ट फ़ाइल को इंगित करें, या वर्तमान निर्देशिका में किसी भी फ़ाइल को दर्शाने के लिए एक तारांकन चिह्न (*) का उपयोग करें। सूचीबद्ध आदेश कन्वेंशन द्वारा इंडेंट किए जाते हैं, इसलिए नेस्टिंग देखना आसान है - लूप्स में छोरों को डालना (ताकि आप लूप को लूप कर सकें).

    क्योंकि सूची रिक्त स्थान को डेलिमिटर के रूप में उपयोग करती है - अर्थात, एक स्थान सूची में अगले आइटम के लिए एक कदम को दर्शाता है - नाम में रिक्त स्थान वाली फाइलें बहुत अनुकूल नहीं हैं। अभी के लिए, बिना रिक्त स्थान के फ़ाइलों के साथ काम करने के लिए छड़ी करते हैं। वर्तमान निर्देशिका में फ़ाइलों के नाम प्रदर्शित करने के लिए एक सरल स्क्रिप्ट के साथ शुरू करें। "लूपस्क्रिप्ट" शीर्षक से अपने ~ / बिन / फ़ोल्डर में एक नई स्क्रिप्ट बनाएं। यदि आपको यह याद नहीं है कि यह कैसे करना है (इसे निष्पादन योग्य के रूप में चिह्नित करना और हैश बैंग हैक को शामिल करना) हमारे बैश स्क्रिप्टिंग लेख को देखें.

    इसमें, निम्नलिखित कोड दर्ज करें:

    i में आइटम 1 के लिए आइटम 2 आइटम 3 आइटम 4 आइटम 5 आइटम 6; करना
    गूंज "$ मैं"
    किया हुआ

    जब आप स्क्रिप्ट चलाते हैं, तो आपको उन सूची आइटम को आउटपुट के रूप में प्राप्त करना चाहिए.

    बहुत आसान है, है ना? आइए देखें कि अगर हम चीजों को थोड़ा बदल दें तो क्या होगा। अपनी स्क्रिप्ट बदलें ताकि यह यह कहे:

    मैं में * के लिए; करना
    गूंज "$ मैं"
    किया हुआ

    जब आप इस स्क्रिप्ट को किसी फ़ोल्डर में चलाते हैं, तो आपको उन फ़ाइलों की एक सूची प्राप्त करनी चाहिए, जिनमें आउटपुट के रूप में है.

    अब, प्रतिध्वनि कमांड को कुछ और उपयोगी में बदलें - मान लीजिए, जिप कमांड। अर्थात्, हम फ़ाइलों को एक संग्रह में जोड़ देंगे। और, चलो मिश्रण में कुछ तर्क मिलते हैं!

    i में $ @ के लिए; करना
    ज़िप संग्रह "$ i"
    किया हुआ

    कुछ नया है! "$ @" "$ 1 $ 2 $ 3 ... $ n" के लिए एक शॉर्टकट है। दूसरे शब्दों में, यह आपके द्वारा निर्दिष्ट सभी तर्कों की पूरी सूची है। अब, देखें कि क्या होता है जब मैं स्क्रिप्ट को कई इनपुट फ़ाइलों के साथ चलाता हूं.

    आप देख सकते हैं कि मेरे फ़ोल्डर में कौन सी फाइलें हैं। मैंने छह तर्कों के साथ कमान चलाई, और प्रत्येक फ़ाइल को "आर्काइव.ज़िप" नामक एक ज़िपित संग्रह में जोड़ा गया। आसान, सही?

    छोरों के लिए बहुत अद्भुत हैं। अब आप फ़ाइलों की सूची पर बैच फ़ंक्शन निष्पादित कर सकते हैं। उदाहरण के लिए, आप अपनी स्क्रिप्ट के सभी तर्कों को ज़िप किए गए संग्रह में कॉपी कर सकते हैं, मूल को एक अलग फ़ोल्डर में स्थानांतरित कर सकते हैं, और उस ज़िप फ़ाइल को दूरस्थ कंप्यूटर पर स्वचालित रूप से सुरक्षित कॉपी कर सकते हैं। यदि आप SSH के साथ मुख्य फाइलें बनाते हैं, तो आपको अपना पासवर्ड दर्ज करने की आवश्यकता नहीं होगी, और आप इसे अपलोड करने के बाद ज़िप फ़ाइल को हटाने के लिए स्क्रिप्ट भी बता सकते हैं।!


    फॉर-लूप्स का उपयोग करना एक निर्देशिका में सभी फ़ाइलों के लिए क्रियाओं का एक गुच्छा करना आसान बनाता है। आप एक साथ कई प्रकार के आदेशों को ढेर कर सकते हैं और सूची बनाने और जारी करने के लिए बहुत आसानी से तर्कों का उपयोग कर सकते हैं, और यह केवल हिमशैल के टिप है.

    बैश स्क्रिप्टर्स, क्या आपके पास कोई सुझाव है? क्या आपने एक उपयोगी स्क्रिप्ट बनाई है जो छोरों का उपयोग करती है? आप श्रृंखला पर विचार साझा करना चाहते हैं? कुछ टिप्पणियों को छोड़ दें और अन्य स्क्रिप्टिंग के नए लेखों की मदद करें!