बैश एक शक्तिशाली प्रोग्रामिंग भाषा है, जिसे कमांड लाइन और शेल स्क्रिप्ट में उपयोग के लिए पूरी तरह से डिज़ाइन किया गया है। यह तीन-भाग श्रृंखला (जो मेरे तीन-खंड वाले लिनक्स स्व-अध्ययन पाठ्यक्रम पर आधारित है) कमांड-लाइन इंटरफ़ेस (सीएलआई) पर प्रोग्रामिंग भाषा के रूप में बैश का उपयोग करने की खोज करती है।
पहले लेख ने बैश के साथ कुछ सरल कमांड-लाइन प्रोग्रामिंग की खोज की, जिसमें चर और नियंत्रण ऑपरेटरों का उपयोग करना शामिल है। यह दूसरा लेख बैश में निष्पादन-प्रवाह नियंत्रण तर्क और विभिन्न प्रकार के शेल विस्तार प्रदान करने वाले फ़ाइल, स्ट्रिंग, संख्यात्मक और विविध तार्किक ऑपरेटरों के प्रकारों को देखता है। श्रृंखला के तीसरे और अंतिम लेख में के लिए . की खोज की जाएगी , जबकि , और तक लूप जो दोहराए जाने वाले संचालन को सक्षम करते हैं।
तार्किक संचालक एक कार्यक्रम में निर्णय लेने और उन निर्णयों के आधार पर निर्देशों के विभिन्न सेटों को क्रियान्वित करने का आधार हैं। इसे कभी-कभी प्रवाह नियंत्रण कहा जाता है।
लॉजिकल ऑपरेटर्स
बैश में तार्किक ऑपरेटरों का एक बड़ा सेट है जिसका उपयोग सशर्त अभिव्यक्तियों में किया जा सकता है। if . का सबसे बुनियादी रूप एक शर्त के लिए नियंत्रण संरचना परीक्षण और फिर स्थिति सही होने पर प्रोग्राम स्टेटमेंट की एक सूची निष्पादित करता है। तीन प्रकार के ऑपरेटर हैं:फ़ाइल, संख्यात्मक और गैर-संख्यात्मक ऑपरेटर। शर्त पूरी न होने पर प्रत्येक ऑपरेटर सही (0) लौटाता है और गलत (1) अगर शर्त पूरी नहीं होती है।
इन तुलना ऑपरेटरों का कार्यात्मक सिंटैक्स एक ऑपरेटर के साथ एक या दो तर्क है जो वर्ग ब्रेसिज़ के भीतर रखा जाता है, इसके बाद प्रोग्राम स्टेटमेंट की एक सूची होती है जो कि स्थिति सही होने पर निष्पादित होती है, और प्रोग्राम स्टेटमेंट की एक वैकल्पिक सूची यदि स्थिति गलत है। :
if [arg1 ऑपरेटर arg2]; फिर सूची
या
if [ arg1 ऑपरेटर arg2 ]; फिर सूची; अन्य सूची; फाई
तुलना में रिक्त स्थान दिखाए गए अनुसार आवश्यक हैं। सिंगल स्क्वायर ब्रेसिज़, [ और ] , पारंपरिक बैश प्रतीक हैं जो परीक्षण . के समतुल्य हैं आदेश:
if test arg1 operator arg2 ; then list
एक और हालिया सिंटैक्स भी है जो कुछ फायदे प्रदान करता है और कुछ sysadmins पसंद करते हैं। यह प्रारूप बैश के विभिन्न संस्करणों और अन्य शेल, जैसे ksh (कोर्न शेल) के साथ थोड़ा कम संगत है। ऐसा लगता है:
if [[ arg1 operator arg2 ]] ; then list
फ़ाइल ऑपरेटर
फ़ाइल ऑपरेटर बैश के भीतर तार्किक ऑपरेटरों का एक शक्तिशाली समूह है। चित्र 1 20 से अधिक विभिन्न ऑपरेटरों को सूचीबद्ध करता है जो बैश फाइलों पर प्रदर्शन कर सकते हैं। मैं उन्हें अपनी स्क्रिप्ट में अक्सर इस्तेमाल करता हूं।
संचालक | <थ स्कोप="col" चौड़ाई="500">विवरण|
---|---|
-एक फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है; यह खाली हो सकता है या इसमें कुछ सामग्री हो सकती है, लेकिन जब तक यह मौजूद है, यह सच होगा |
-b फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और एक ब्लॉक विशेष फ़ाइल है जैसे कि हार्ड ड्राइव जैसे /dev/sda या /dev/sda1 |
-c फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और यह एक वर्ण विशेष फ़ाइल है जैसे कि एक TTY डिवाइस जैसे /dev/TTY1 |
-d फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और एक निर्देशिका है |
-e फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है; यह -a . जैसा ही है ऊपर |
-f फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और एक निर्देशिका, एक डिवाइस विशेष फ़ाइल, या एक लिंक के विपरीत एक नियमित फ़ाइल है, अन्य के बीच |
-g फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और सेट-ग्रुप-आईडी है , SETGID |
-h फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और एक प्रतीकात्मक लिंक है |
-k फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और उसका "चिपचिपा" बिट सेट है |
-p फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और एक नामित पाइप (FIFO) है |
-r फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और पढ़ने योग्य है, यानी, इसका रीड बिट सेट है |
-s फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और उसका आकार शून्य से बड़ा है; एक फ़ाइल जो मौजूद है, लेकिन उसका आकार शून्य है, झूठी वापसी करेगी |
-t fd | सही है अगर फ़ाइल डिस्क्रिप्टर fd खुला है और एक टर्मिनल को संदर्भित करता है |
-यू फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और उसकी सेट-यूज़र-आईडी बिट सेट है |
-w फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और लिखने योग्य है |
-x फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और निष्पादन योग्य है |
-G फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और प्रभावी समूह आईडी के स्वामित्व में है |
-एल फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और एक प्रतीकात्मक लिंक है |
-N फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और इसे पिछली बार पढ़े जाने के बाद से संशोधित किया गया है |
-O फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और प्रभावी उपयोगकर्ता आईडी के स्वामित्व में है |
-S फ़ाइल नाम | सही है अगर फ़ाइल मौजूद है और एक सॉकेट है |
file1 -ef file2 | सही है अगर file1 और file2 एक ही डिवाइस और आईनोड नंबर को संदर्भित करते हैं |
file1 -nt file2 | सही है अगर फ़ाइल1 फ़ाइल2 से नई (संशोधन तिथि के अनुसार) है, या यदि फ़ाइल1 मौजूद है और फ़ाइल2 नहीं है |
file1 -ot file2 | सही है अगर file1 file2 से पुराना है, या file2 मौजूद है और file1 नहीं है |
अंजीर। 1:बैश फ़ाइल ऑपरेटर
उदाहरण के तौर पर, फ़ाइल के अस्तित्व के लिए परीक्षण करके प्रारंभ करें:
[student@studentvm1 testdir]$ File="TestFile1"; अगर [-ई $ फ़ाइल]; फिर गूंज "फ़ाइल $ फ़ाइल मौजूद है।"; अन्य गूंज "फ़ाइल $ फ़ाइल मौजूद नहीं है।"; fi
फ़ाइल TestFile1 मौजूद नहीं है।
[student@studentvm1 testdir]$
इसके बाद, TestFile1 . नामक परीक्षण के लिए एक फ़ाइल बनाएं . अभी के लिए, इसमें कोई डेटा शामिल करने की आवश्यकता नहीं है:
[student@studentvm1 testdir]$ touch TestFile1
$फ़ाइल . का मान बदलना आसान है इस संक्षिप्त सीएलआई कार्यक्रम में फ़ाइल नाम के लिए एक से अधिक स्थानों में टेक्स्ट स्ट्रिंग के बजाय चर:
[student@studentvm1 testdir]$ File="TestFile1"; अगर [-ई $ फ़ाइल]; फिर गूंज "फ़ाइल $ फ़ाइल मौजूद है।"; अन्य गूंज "फ़ाइल $ फ़ाइल मौजूद नहीं है।"; fi
फ़ाइल TestFile1 मौजूद है।
[student@studentvm1 testdir]$
अब, यह निर्धारित करने के लिए एक परीक्षण चलाएँ कि क्या कोई फ़ाइल मौजूद है और उसकी लंबाई गैर-शून्य है, जिसका अर्थ है कि इसमें डेटा है। आप तीन शर्तों के लिए परीक्षण करना चाहते हैं:1. फ़ाइल मौजूद नहीं है; 2. फ़ाइल मौजूद है और खाली है; और 3. फ़ाइल मौजूद है और इसमें डेटा है। इसलिए, आपको परीक्षणों के अधिक जटिल सेट की आवश्यकता है—elif . का उपयोग करें if-elif-else . में छंद सभी शर्तों के परीक्षण के लिए निर्माण करें:
[student@studentvm1 testdir]$ File="TestFile1"; अगर [-एस $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और इसमें डेटा है।"; फाई
[student@studentvm1 testdir]$
इस मामले में, फ़ाइल मौजूद है लेकिन उसमें कोई डेटा नहीं है। कुछ डेटा जोड़ें और पुन:प्रयास करें:
[student@studentvm1 testdir]$ File="TestFile1"; इको "यह फाइल है $फाइल"> $फाइल; अगर [-एस $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और इसमें डेटा है।"; fi
TestFile1 मौजूद है और इसमें डेटा है।
[student@studentvm1 testdir]$
यह काम करता है, लेकिन यह तीन संभावित स्थितियों में से केवल एक विशिष्ट स्थिति के लिए सही मायने में सटीक है। एक अन्यजोड़ें छंद ताकि आप कुछ अधिक सटीक हो सकें, और फ़ाइल को हटा दें ताकि आप इस नए कोड का पूरी तरह से परीक्षण कर सकें:
[student@studentvm1 testdir]$ File="TestFile1"; आरएम $ फ़ाइल; अगर [-एस $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और इसमें डेटा है।"; और गूंज "$ फ़ाइल मौजूद नहीं है या खाली है।"; fi
TestFile1 मौजूद नहीं है या खाली है।
अब परीक्षण के लिए एक खाली फ़ाइल बनाएँ:
[student@studentvm1 testdir]$ File="TestFile1"; $ फ़ाइल स्पर्श करें; अगर [-एस $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और इसमें डेटा है।"; और गूंज "$ फ़ाइल मौजूद नहीं है या खाली है।"; fi
TestFile1 मौजूद नहीं है या खाली है।
फ़ाइल में कुछ सामग्री जोड़ें और फिर से परीक्षण करें:
[student@studentvm1 testdir]$ File="TestFile1"; इको "यह फाइल है $फाइल"> $फाइल; अगर [-एस $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और इसमें डेटा है।"; और गूंज "$ फ़ाइल मौजूद नहीं है या खाली है।"; fi
TestFile1 मौजूद है और इसमें डेटा है।
अब, elif . जोड़ें एक फ़ाइल जो मौजूद नहीं है और एक जो खाली है, के बीच भेदभाव करने के लिए छंद:
[student@studentvm1 testdir]$ File="TestFile1"; $ फ़ाइल स्पर्श करें; अगर [-एस $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और इसमें डेटा है।"; एलिफ [-ई $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और खाली है।"; अन्य गूंज "$ फ़ाइल मौजूद नहीं है।"; fi
TestFile1 मौजूद है और खाली है।
[student@studentvm1 testdir]$ File="TestFile1"; इको "यह $ फ़ाइल है"> $ फ़ाइल; अगर [-एस $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और इसमें डेटा है।"; एलिफ [-ई $ फ़ाइल]; फिर गूंज "$ फ़ाइल मौजूद है और खाली है।"; अन्य गूंज "$ फ़ाइल मौजूद नहीं है।"; fi
TestFile1 मौजूद है और इसमें डेटा है।
[student@studentvm1 testdir]$
अब आपके पास एक बैश सीएलआई प्रोग्राम है जो इन तीन अलग-अलग स्थितियों के लिए परीक्षण कर सकता है... लेकिन संभावनाएं अनंत हैं।
अधिक जटिल कंपाउंड कमांड की तर्क संरचना को देखना आसान है यदि आप प्रोग्राम स्टेटमेंट को अधिक व्यवस्थित करते हैं जैसे आप एक स्क्रिप्ट में करते हैं जिसे आप एक फ़ाइल में सहेज सकते हैं। चित्र 2 दिखाता है कि यह कैसा दिखेगा। if-elif-else के प्रत्येक श्लोक में प्रोग्राम स्टेटमेंट के इंडेंट संरचना तर्क को स्पष्ट करने में मदद करती है।
File="TestFile1"
echo "यह $File है"> $File
अगर [-s $File ]
तो
echo "$File मौजूद है और इसमें डेटा है ।"
elif [ -e $File ]
फिर
echo "$File मौजूद है और खाली है।"
else
echo "$File मौजूद नहीं है।"
फाई
अंजीर। 2:कमांड लाइन प्रोग्राम को फिर से लिखा जाता है क्योंकि यह एक स्क्रिप्ट में दिखाई देगा
तर्क यह परिसर अधिकांश सीएलआई कार्यक्रमों के लिए बहुत लंबा है। हालांकि सीएलआई कार्यक्रमों में किसी भी लिनक्स या बैश बिल्ट-इन कमांड का उपयोग किया जा सकता है, क्योंकि सीएलआई प्रोग्राम लंबे और अधिक जटिल हो जाते हैं, यह एक ऐसी स्क्रिप्ट बनाने के लिए अधिक समझ में आता है जो एक फाइल में संग्रहीत होती है और किसी भी समय, अभी या निष्पादित की जा सकती है। भविष्य में।
स्ट्रिंग तुलना ऑपरेटर
स्ट्रिंग तुलना ऑपरेटर वर्णों के अल्फ़ान्यूमेरिक स्ट्रिंग्स की तुलना को सक्षम करते हैं। इनमें से कुछ ही ऑपरेटर हैं, जो चित्र 3 में सूचीबद्ध हैं।
संचालक | <थ स्कोप="col" चौड़ाई="450">विवरण|
---|---|
-z स्ट्रिंग | सही है अगर स्ट्रिंग की लंबाई शून्य है |
-n स्ट्रिंग | सही है अगर स्ट्रिंग की लंबाई गैर-शून्य है |
string1 ==string2 या string1 =string2 | सही है अगर तार बराबर हैं; एक एकल = POSIX अनुरूपता के लिए परीक्षण कमांड के साथ प्रयोग किया जाना चाहिए। जब [[ . के साथ प्रयोग किया जाता है कमांड, यह ऊपर वर्णित (कंपाउंड कमांड) के अनुसार पैटर्न मिलान करता है। |
string1 !=string2 | सही है अगर तार बराबर नहीं हैं |
string1 सही है अगर string1 स्ट्रिंग2 से पहले लेक्सिकोग्राफ़िक रूप से सॉर्ट करता है (सभी अल्फ़ान्यूमेरिक और विशेष वर्णों के लिए स्थानीय-विशिष्ट सॉर्टिंग अनुक्रमों को संदर्भित करता है) | |
string1> string2 | सही है अगर string1 स्ट्रिंग2 के बाद लेक्सिकोग्राफ़िक रूप से सॉर्ट करता है |
अंजीर। 3:बैश स्ट्रिंग लॉजिकल ऑपरेटर्स
सबसे पहले, स्ट्रिंग की लंबाई देखें। $MyVar . के आसपास के उद्धरण तुलना में काम की तुलना के लिए होना चाहिए। (आपको अभी भी ~/testdir . में काम करना चाहिए ।)
[student@studentvm1 testdir]$ MyVar=""; अगर [-जेड ""]; फिर गूंजें "MyVar की लंबाई शून्य है।"; और गूंज "MyVar में डेटा है"; fi
MyVar की लंबाई शून्य है।
[student@studentvm1 testdir]$ MyVar="Random text"; अगर [-जेड ""]; फिर गूंजें "MyVar की लंबाई शून्य है।"; और गूंज "MyVar में डेटा है"; fi
MyVar की लंबाई शून्य है।
आप इसे इस तरह भी कर सकते हैं:
[student@studentvm1 testdir]$ MyVar="Random text"; अगर [-n "$ MyVar"]; फिर गूंजें "MyVar में डेटा है।"; और गूंज "माईवर शून्य लंबाई है"; fi
MyVar में डेटा है।
[student@studentvm1 testdir]$ MyVar=""; अगर [-n "$ MyVar"]; फिर गूंजें "MyVar में डेटा है।"; और गूंज "माईवर शून्य लंबाई है"; fi
MyVar की लंबाई शून्य है
कभी-कभी आपको स्ट्रिंग की सटीक लंबाई जानने की आवश्यकता हो सकती है। यह तुलना नहीं है, बल्कि संबंधित है। दुर्भाग्य से, स्ट्रिंग की लंबाई निर्धारित करने का कोई आसान तरीका नहीं है। इसे करने के कुछ तरीके हैं, लेकिन मुझे लगता है कि expr . का उपयोग करना (अभिव्यक्ति का मूल्यांकन करें) कमांड सबसे आसान है। expr . के लिए मैन पेज पढ़ें यह क्या कर सकता है इसके बारे में अधिक जानकारी के लिए। ध्यान दें कि आपके द्वारा परीक्षण किए जा रहे स्ट्रिंग या वेरिएबल के आसपास उद्धरण आवश्यक हैं।
[student@studentvm1 testdir]$ MyVar=""; expr लंबाई "$MyVar"
0
[student@studentvm1 testdir]$ MyVar="यह कब तक है?"; expr लंबाई "$MyVar"
17
[student@studentvm1 testdir]$ expr लंबाई "हम एक शाब्दिक स्ट्रिंग की लंबाई के साथ-साथ एक चर भी ढूंढ सकते हैं।"
70
तुलना ऑपरेटरों के संबंध में, मैं यह निर्धारित करने के लिए अपनी स्क्रिप्ट में बहुत सारे परीक्षण का उपयोग करता हूं कि क्या दो तार बराबर हैं (यानी, समान)। मैं इस तुलना ऑपरेटर के गैर-POSIX संस्करण का उपयोग करता हूं:
[student@studentvm1 testdir]$ Var1="Hello World"; Var2 ="हैलो वर्ल्ड"; अगर ["$Var1" =="$Var2"]; फिर गूंज "Var1 Var2 से मेल खाता है"; अन्य गूंज "Var1 और Var2 मेल नहीं खाते।"; fi
Var1 Var2 से मेल खाता है
[student@studentvm1 testdir]$ Var1="Hello World"; Var2 ="हैलो वर्ल्ड"; अगर ["$Var1" =="$Var2"]; फिर गूंज "Var1 Var2 से मेल खाता है"; अन्य गूंज "Var1 और Var2 मेल नहीं खाते।"; fi
Var1 और Var2 मेल नहीं खाते।
इन ऑपरेटरों को आज़माने के लिए स्वयं कुछ और प्रयोग करें।
संख्यात्मक तुलना ऑपरेटर
संख्यात्मक ऑपरेटर दो संख्यात्मक तर्कों के बीच तुलना करते हैं। अन्य ऑपरेटर वर्गों की तरह, अधिकांश को समझना आसान है।
संचालक | <थ स्कोप="col" चौड़ाई="500">विवरण|
---|---|
arg1 -eq arg2 | सही है अगर arg1 arg2 के बराबर है |
arg1 -ne arg2 | सही है अगर arg1 arg2 के बराबर नहीं है |
arg1 -lt arg2 | सही है अगर arg1 arg2 से कम है |
arg1 -le arg2 | सही है अगर arg1 arg2 से कम या उसके बराबर है |
arg1 -gt arg2 | सही है अगर arg1 arg2 से बड़ा है |
arg1 -ge arg2 | सही है अगर arg1 arg2 से बड़ा या उसके बराबर है |
अंजीर। 4:संख्यात्मक तुलना तार्किक ऑपरेटरों को बैश करें
यहां कुछ सरल उदाहरण दिए गए हैं। पहला उदाहरण वैरिएबल $X . सेट करता है 1 तक, फिर यह देखने के लिए परीक्षण करें कि क्या $X 1 के बराबर है। दूसरे उदाहरण में, X 0 पर सेट है, इसलिए तुलना सही नहीं है।
[student@studentvm1 testdir]$ X=1; अगर [$ एक्स -ईक 1]; फिर गूंज "एक्स बराबर 1"; और गूंज "एक्स बराबर नहीं 1"; fi
X बराबर 1
[student@studentvm1 testdir]$ X=0; अगर [$ एक्स -ईक 1]; फिर गूंज "एक्स बराबर 1"; और गूंज "एक्स बराबर नहीं 1"; fi
X बराबर नहीं है 1
[student@studentvm1 testdir]$
स्वयं कुछ और प्रयोग करके देखें।
विविध ऑपरेटर
ये विविध ऑपरेटर दिखाते हैं कि क्या शेल विकल्प सेट है या शेल वैरिएबल का कोई मान है, लेकिन यह वैरिएबल के मान की खोज नहीं करता है, चाहे उसमें एक हो।
संचालक | <थ स्कोप="col" चौड़ाई="500">विवरण|
---|---|
-o ऑप्टनाम | सही है अगर शेल विकल्प ऑप्टनाम सक्षम है (-o के विवरण के तहत विकल्पों की सूची देखें। बैश मैन पेज में निर्मित बैश सेट का विकल्प) |
-v varname | सही है यदि शेल चर varname सेट है (एक मान दिया गया है) |
-R varname | सही है यदि शेल चर varname सेट है और एक नाम संदर्भ है |
अंजीर। 5:विविध बैश लॉजिकल ऑपरेटर्स
इन ऑपरेटरों को आजमाने के लिए स्वयं प्रयोग करें।
विस्तार
बैश कई प्रकार के विस्तार और प्रतिस्थापन का समर्थन करता है जो काफी उपयोगी हो सकते हैं। बैश मैन पेज के अनुसार, बैश के विस्तार के सात रूप हैं। यह लेख उनमें से पांच को देखता है:टिल्ड विस्तार, अंकगणितीय विस्तार, पथनाम विस्तार, ब्रेस विस्तार, और कमांड प्रतिस्थापन।
ब्रेस एक्सपेंशन
ब्रेस विस्तार मनमाना तार उत्पन्न करने की एक विधि है। (इस टूल का उपयोग नीचे विशेष पैटर्न वर्णों के साथ प्रयोगों के लिए बड़ी संख्या में फ़ाइलें बनाने के लिए किया जाता है।) ब्रेस विस्तार का उपयोग मनमानी स्ट्रिंग्स की सूची बनाने और उन्हें एक संलग्न स्थिर स्ट्रिंग के भीतर या एक के दोनों छोर पर एक विशिष्ट स्थान में डालने के लिए किया जा सकता है। स्थिर स्ट्रिंग। यह कल्पना करना कठिन हो सकता है, इसलिए इसे करना ही सबसे अच्छा है।
सबसे पहले, यहां बताया गया है कि ब्रेस एक्सपेंशन क्या करता है:
[student@studentvm1 testdir]$ echo {string1,string2,string3}
string1 string2 string3
अच्छा, यह बहुत मददगार नहीं है, है ना? लेकिन देखिए क्या होता है जब आप इसे थोड़ा अलग तरीके से इस्तेमाल करते हैं:
[student@studentvm1 testdir]$ echo "Hello "{David,Jen,Rikki,Jason}।
नमस्कार डेविड। हैलो जेन। हैलो रिक्की। नमस्ते जेसन।
यह कुछ उपयोगी प्रतीत होता है—यह टाइपिंग का एक अच्छा सौदा बचा सकता है। अब इसे आजमाएं:
[student@studentvm1 testdir]$ echo b{ed,olt,ar}s
बेड बोल्ट बार
मैं आगे बढ़ सकता था, लेकिन आपको समझ में आ गया।
टिल्डे विस्तार
यकीनन, सबसे आम विस्तार टिल्ड है (~ ) विस्तार। जब आप इसका उपयोग cd ~/Documents . जैसे कमांड में करते हैं , बैश शेल इसे उपयोगकर्ता की पूर्ण होम निर्देशिका के शॉर्टकट के रूप में विस्तारित करता है।
टिल्ड विस्तार के प्रभावों को देखने के लिए इन बैश कार्यक्रमों का उपयोग करें:
[student@studentvm1 testdir]$ echo ~
/home/student
[student@studentvm1 testdir]$ echo ~/Documents
/home/student/Documents
[ छात्र@studentvm1 testdir]$ Var1=~/Documents; इको $ Var1; सीडी $Var1
/home/student/Documents
[student@studentvm1 Documents]$
पथनाम विस्तार
पथनाम विस्तार एक फैंसी शब्द है जो ? . वर्णों का उपयोग करके फ़ाइल-ग्लोबिंग पैटर्न का विस्तार करता है और * , पैटर्न से मेल खाने वाली निर्देशिकाओं के पूर्ण नामों में। फ़ाइल ग्लोबिंग विशेष पैटर्न वर्णों को संदर्भित करता है जो विभिन्न क्रियाओं को करते समय फ़ाइल नामों, निर्देशिकाओं और अन्य स्ट्रिंग्स के मिलान में महत्वपूर्ण लचीलेपन को सक्षम करता है। ये विशेष पैटर्न वर्ण एक स्ट्रिंग में एकल, एकाधिक, या विशिष्ट वर्णों के मिलान की अनुमति देते हैं।
- ? — स्ट्रिंग के भीतर निर्दिष्ट स्थान में किसी भी वर्ण में से केवल एक से मेल खाता है
- * — स्ट्रिंग के भीतर निर्दिष्ट स्थान में किसी भी वर्ण के शून्य या अधिक से मेल खाता है
यह विस्तार निर्देशिका नामों के मिलान पर लागू होता है। यह कैसे काम करता है यह देखने के लिए, सुनिश्चित करें कि testdir वर्तमान कार्यशील निर्देशिका (पीडब्ल्यूडी) है और एक सामान्य सूची के साथ शुरू होती है (मेरी होम निर्देशिका की सामग्री आपके से अलग होगी):
[student@studentvm1 testdir]$ ls
chapter6 cpuHog.dos dmesg1.txt दस्तावेज़ संगीत softlink1 testdir6 वीडियो
अध्याय7 cpuHog. dmesg3.txt file005 सार्वजनिक testdir tmp
cpuHog डेस्कटॉप dmesg.txt link3 random.txt testdir1 umask.test
[student@studentv]अब उन निर्देशिकाओं को सूचीबद्ध करें जो करें . से शुरू होती हैं , testdir/दस्तावेज़ , और testdir/डाउनलोड :
दस्तावेज़:
Directory01 File07 File15 Test02 Test02 Test02 Test20 Test20 TestFile13 TextFiles
Directory02 File08 File08 File16 Test03 Test03 Test03 TestFile01 TestFile14
file03 file11 file19 test06 test14 testfile09 testfile17
डाउनलोड:
[student@studentvm1 testdir]$ठीक है, उसने वह नहीं किया जो आप चाहते थे। यह उन निर्देशिकाओं की सामग्री को सूचीबद्ध करता है जो Do . से शुरू होती हैं . केवल निर्देशिकाओं को सूचीबद्ध करने के लिए और उनकी सामग्री को नहीं, -d . का उपयोग करें विकल्प।
[student@studentvm1 testdir]$ ls -d Do*
दस्तावेज़ डाउनलोड
[student@studentvm1 testdir]$दोनों ही मामलों में, बैश शेल Do . का विस्तार करता है * पैटर्न से मेल खाने वाली दो निर्देशिकाओं के नामों में पैटर्न। लेकिन क्या होगा अगर ऐसी फाइलें भी हैं जो पैटर्न से मेल खाती हैं?
[student@studentvm1 testdir]$ डाउनटाउन को टच करें; ls -d Do*
दस्तावेज़ डाउनलोड डाउनटाउन
[student@studentvm1 testdir]$यह फ़ाइल भी दिखाता है। इसलिए पैटर्न से मेल खाने वाली किसी भी फाइल को उनके पूरे नामों में विस्तारित किया जाता है।
कमांड प्रतिस्थापन
कमांड प्रतिस्थापन विस्तार का एक रूप है जो एक कमांड के STDOUT डेटा स्ट्रीम को दूसरे कमांड के तर्क के रूप में उपयोग करने की अनुमति देता है; उदाहरण के लिए, लूप में संसाधित की जाने वाली वस्तुओं की सूची के रूप में। बैश मैन पेज कहता है:"कमांड प्रतिस्थापन कमांड के आउटपुट को कमांड नाम को बदलने की अनुमति देता है।" मुझे लगता है कि अगर थोड़ा सा भी गलत है तो यह सटीक होगा।
इस प्रतिस्थापन के दो रूप हैं, `कमांड` और $(कमांड) . पुराने रूप में back tics का उपयोग करना (` ), बैकस्लैश का उपयोग करके (\ ) कमांड में अपने शाब्दिक अर्थ को बरकरार रखता है। हालाँकि, जब इसका उपयोग नए पैरेंटेटिकल रूप में किया जाता है, तो बैकस्लैश एक विशेष वर्ण के रूप में अपना अर्थ ग्रहण कर लेता है। यह भी ध्यान दें कि कमांड स्टेटमेंट को खोलने और बंद करने के लिए पैरेंटेटिकल फॉर्म केवल सिंगल कोष्ठक का उपयोग करता है।
मैं अक्सर कमांड-लाइन प्रोग्राम और स्क्रिप्ट में इस क्षमता का उपयोग करता हूं जहां एक कमांड के परिणाम दूसरे कमांड के लिए तर्क के रूप में उपयोग किए जा सकते हैं।
एक बहुत ही सरल उदाहरण से शुरू करें जो इस विस्तार के दोनों रूपों का उपयोग करता है (फिर से, सुनिश्चित करें कि testdir पीडब्ल्यूडी है):
[student@studentvm1 testdir]$ echo "आज की तारीख `तारीख' है"
आज की तारीख सूर्य अप्रैल है 7 14:42:46 EDT 2019
[student@studentvm1 testdir]$ echo "Todays date is $(date)"
आज की तारीख सूर्य अप्रैल 7 14:42:59 EDT 2019
[student@studentvm1 testdir]$-w seq . का विकल्प उपयोगिता उत्पन्न संख्याओं में अग्रणी शून्य जोड़ती है ताकि वे सभी समान चौड़ाई हों, अर्थात, अंकों की संख्या समान हो, मूल्य की परवाह किए बिना। इससे उन्हें संख्यात्मक क्रम में क्रमबद्ध करना आसान हो जाता है।
सेक उपयोगिता का उपयोग संख्याओं का एक क्रम उत्पन्न करने के लिए किया जाता है:
[student@studentvm1 testdir]$ seq 5
1
2
3
4
5
[student@studentvm1 testdir]$ echo ` seq 5`
1 2 3 4 5
[student@studentvm1 testdir]$अब आप कुछ अधिक उपयोगी काम कर सकते हैं, जैसे परीक्षण के लिए बड़ी संख्या में खाली फ़ाइलें बनाना:
[student@studentvm1 testdir]$ for I in $(seq -w 5000) ; do touch file-$I ; done
इस प्रयोग में, कथन seq -w 5000 एक से 5,000 तक की संख्याओं की सूची बनाता है। के लिए . के भाग के रूप में कमांड प्रतिस्थापन का उपयोग करके कथन, संख्याओं की सूची का उपयोग के लिए . द्वारा किया जाता है फ़ाइल नामों के संख्यात्मक भाग को उत्पन्न करने के लिए कथन।
अंकगणितीय विस्तार
बैश पूर्णांक गणित कर सकता है, लेकिन यह बोझिल है (जैसा कि आप जल्द ही देखेंगे)। अंकगणितीय विस्तार का सिंटैक्स $((अंकगणित-अभिव्यक्ति)) . है , व्यंजक को खोलने और बंद करने के लिए दोहरे कोष्ठकों का उपयोग करते हुए।
अंकगणितीय विस्तार शेल प्रोग्राम या स्क्रिप्ट में कमांड प्रतिस्थापन की तरह काम करता है; व्यंजक से परिकलित मान, शेल द्वारा आगे के मूल्यांकन के लिए व्यंजक को प्रतिस्थापित करता है।
एक बार फिर, कुछ आसान से शुरू करें:
[student@studentvm1 testdir]$ echo $((1+1))
2
[student@studentvm1 testdir]$ Var1=5; वर2=7; Var3=$((Var1*Var2)); इको "वर 3 =$Var3"
वर 3 =35निम्नलिखित विभाजन का परिणाम शून्य है क्योंकि परिणाम एक से कम का दशमलव मान होगा:
[student@studentvm1 testdir]$ Var1=5; वर2=7; Var3=$((Var1/Var2)); इको "वर 3 =$Var3"
वर 3 =0यहां एक साधारण गणना है जो मैं अक्सर एक स्क्रिप्ट या सीएलआई प्रोग्राम में करता हूं जो मुझे बताता है कि मेरे पास लिनक्स होस्ट में कितनी वर्चुअल मेमोरी है। मुफ़्त कमांड वह डेटा प्रदान नहीं करता है:
[student@studentvm1 testdir]$ RAM=`free | ग्रेप ^मेम | awk '{प्रिंट $2}'`; स्वैप=`मुक्त | ग्रेप ^ स्वैप | awk '{प्रिंट $2}'`; इको "रैम =$ रैम और स्वैप =$ स्वैप"; इको "कुल वर्चुअल मेमोरी $((RAM+Swap)) है";है
RAM =4037080 और स्वैप =6291452
कुल वर्चुअल मेमोरी 10328532मैंने ` . का इस्तेमाल किया कमांड प्रतिस्थापन के लिए उपयोग किए गए कोड के अनुभागों को परिसीमित करने के लिए वर्ण।
मैं ज्यादातर स्क्रिप्ट में सिस्टम संसाधन मात्रा की जांच के लिए बैश अंकगणितीय विस्तार का उपयोग करता हूं और फिर परिणाम के आधार पर प्रोग्राम निष्पादन पथ चुनता हूं।
सारांश
यह आलेख, प्रोग्रामिंग भाषा के रूप में बैश पर इस श्रृंखला में दूसरा, बैश फ़ाइल, स्ट्रिंग, न्यूमेरिक और विविध तार्किक ऑपरेटरों की खोज करता है जो निष्पादन-प्रवाह नियंत्रण तर्क और विभिन्न प्रकार के शेल विस्तार प्रदान करते हैं।
इस श्रृंखला का तीसरा लेख विभिन्न प्रकार के पुनरावृत्तीय संक्रियाओं को करने के लिए लूपों के उपयोग की खोज करेगा।