Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Bash प्रोग्रामिंग

त्वरित सूची निर्माण के लिए कुशल Bash ब्रेस विस्तार

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

ताकि यह सब पूरी तरह से पागल न हो जाए, आपको कुछ उपहार सूचियां बनानी चाहिए। Bash मदद कर सकता है।

ब्रेस विस्तार

ये ब्रेस नहीं हैं: ()

ये भी नहीं हैं: []

ये ब्रेस हैं: {}

ब्रेस Bash को बताते हैं कि उनके बीच मिलने वाले मनमाने स्ट्रिंग या स्ट्रिंग्स के साथ कुछ करें। कई स्ट्रिंग्स कॉमा-सेपरेटेड हैं: {a,b,c}। आप प्रत्येक विस्तारित परिणाम से जुड़े एक वैकल्पिक प्रस्तावना और पोस्टस्क्रिप्ट भी जोड़ सकते हैं। ज्यादातर, यह कुछ टाइपिंग बचा सकता है, जैसे सामान्य फाइल पथ और एक्सटेंशन के साथ।

आइए प्रत्येक व्यक्ति के लिए कुछ सूचियां बनाएं जिन्हें हम सामान देना चाहते हैं। निम्नलिखित कमांड समतुल्य हैं:

touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txt
touch /home/me/gift-lists/{Amy,Bryan,Charlie}.txt
tree gift-lists
/home/me/gift-lists
├── Amy.txt
├── Bryan.txt
└── Charlie.txt

अरे नहीं, "Bryan" अपने नाम की स्पेलिंग "i" के साथ करता है। मैं इसे ठीक कर सकता हूं।

mv /home/me/gift-lists/{Bryan,Brian}.txt
renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'

शेल पैरामीटर विस्तार

शेल पैरामीटर विस्तार हमें ब्रेस में संलग्न पैरामीटर्स में सभी प्रकार के परिवर्तन करने की अनुमति देता है, जैसे टेक्स्ट में हेरफेर और प्रतिस्थापन।

कुछ स्टॉकिंग स्टफर्स हैं जो हमारे सभी उपहार पाने वालों के लायक हैं। आइए इसे एक वेरिएबल बनाएं:

STUFF=$'socks\nlump of coal\nwhite chocolate'
echo "$STUFF"
socks
lump of coal
white chocolate

अब tee कमांड की मदद से इन वस्तुओं को हमारी प्रत्येक सूची में जोड़ें ताकि echo और विस्तार अच्छा खेलें।

echo "$STUFF" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate

पैटर्न मिलान प्रतिस्थापन

दूसरे विचार पर, शायद कोयले का टुकड़ा इतना अच्छा उपहार नहीं है। आप इसे पैटर्न मिलान प्रतिस्थापन का उपयोग करके कुछ बेहतर से बदल सकते हैं, जिसका रूप ${parameter/pattern/string} है:

echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
socks
candy cane
white chocolate
socks
candy cane
white chocolate

यह "कोयले का टुकड़ा" के पहले उदाहरण को "कैंडी केन" से बदल देता है। सभी उदाहरणों को बदलने के लिए (यदि कई होते), ${parameter//pattern/string} का उपयोग करें। यह हमारे $STUFF वेरिएबल को नहीं बदलता है, इसलिए हम बाद में किसी शरारती व्यक्ति के लिए मूल सूची का पुन: उपयोग कर सकते हैं।

सबस्ट्रिंग्स

जबकि हम चीजों में सुधार कर रहे हैं, हमारे उपहार पाने वालों को सभी को सफेद चॉकलेट पसंद नहीं हो सकती है। हमें अपनी सूचियों में कुछ नियमित चॉकलेट जोड़नी चाहिए बस मामले में। चूंकि मैं सुपर आलसी हूं, मैं बस अप एरो दबाऊंगा और पिछले Bash कमांड को संशोधित करूंगा। सौभाग्य से, $STUFF वेरिएबल में अंतिम शब्द "चॉकलेट" है, जो नौ कैरेक्टर लंबा है, इसलिए मैं Bash को सिर्फ उस भाग को रखने के लिए कहूंगा ${parameter:offset} का उपयोग करके। मैं मौजूदा सूचियों में जोड़ने के लिए tee के -a फ्लैग का उपयोग करूंगा:

echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate

आप भी कर सकते हैं:

यह करें इसके साथ
n कैरेक्टर से सबस्ट्रिंग प्राप्त करें ${parameter:n}
n से शुरू होकर x कैरेक्टर के लिए सबस्ट्रिंग प्राप्त करें ${parameter:n:x}

वहां! अब हमारी बेस सूचियां समाप्त हो गई हैं। आइए कुछ एगनॉग लेते हैं।

वेरिएबल का परीक्षण

आप जानते हैं, यह एगनॉग हो सकता है, लेकिन मुझे लगता है कि मैंने कल एमी के लिए एक सूची शुरू की थी और इसे एक वेरिएबल में संग्रहीत किया था जिसे मैंने amy कहा होगा। आइए देखें कि मैंने किया था। मैं ${parameter:?word} विस्तार का उपयोग करूंगा। यदि कोई amy पैरामीटर नहीं है तो यह word को मानक त्रुटि पर लिखेगा और बाहर निकल जाएगा।

echo "${amy:?no such}"
bash: amy: no such

मुझे लगता है नहीं। शायद यह ब्रायन था?

echo "${brian:?no such}"
Lederhosen

आप भी कर सकते हैं:

यह करें इसके साथ
यदि parameter अनसेट या नल है तो word प्रतिस्थापित करें ${parameter:-word}
यदि parameter अनसेट या नल नहीं है तो word प्रतिस्थापित करें ${parameter:+word}
यदि parameter अनसेट या नल है तो word को parameter में असाइन करें ${parameter:=word}

केस बदलना

यह सही है! ब्रायन ने कहा कि वह कुछ लेडरहोज़न चाहता था और इसलिए मैंने खुद को एक नोट बनाया। यह काफी महत्वपूर्ण है, इसलिए मैं इसे ${parameter^^pattern} विस्तार का उपयोग करके ब्रायन की सूची में बड़े अक्षरों में जोड़ूंगा। pattern भाग वैकल्पिक है। हम केवल ब्रायन की सूची में लिख रहे हैं, इसलिए मैं tee -a के बजाय सिर्फ >> का उपयोग करूंगा।

echo "${brian^^}" >> Brian.txt
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN

आप भी कर सकते हैं:

यह करें इसके साथ
पहला अक्षर बड़ा करें ${parameter^pattern}
पहला अक्षर छोटा करें ${parameter,pattern}
सभी अक्षर छोटे करें ${parameter,,pattern}

ऐरे का विस्तार

आप जानते हैं क्या, यह सब उपहार-सूची व्यवसाय बहुत काम का है। मैं बस उन चीजों का एक ऐरे बनाने जा रहा हूं जो मैंने दुकान पर देखीं:

gifts=(sweater gameboy wagon pillows chestnuts hairbrush)

मैं ${parameter:offset:length} के रूप में सबस्ट्रिंग विस्तार का उपयोग करके इसे सरल बना सकता हूं। मैं पहले दो को एमी की सूची में जोड़ूंगा, मध्य दो को ब्रायन की, और अंतिम दो को चार्ली की। नई लाइन में मदद के लिए मैं printf का उपयोग करूंगा।

printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt
printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt
printf '%s\n' "${gifts[@]: -2}" >> Charlie.txt
cat Amy.txt
socks
candy cane
white chocolate
chocolate
sweater
gameboy
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN
wagon
pillows
cat Charlie.txt
socks
candy cane
white chocolate
chocolate
chestnuts
hairbrush

वहां! अब हमारे पास सुपर व्यक्तिगत उपहार सूचियों का एक व्यापक सेट है। धन्यवाद Bash! खराबी यह है कि यह हमारे लिए खरीदारी नहीं कर सकता।

  1. - बैश फॉर और व्हाइल लूप में महारत: व्यावहारिक उदाहरण और सिंटैक्स

    किसी भी अन्य स्क्रिप्टिंग भाषा की तरह, बैश में भी लूप के लिए सपोर्ट है। लूप दोहराए जाने वाले कार्यों के लिए बहुत अच्छे होते हैं। हम अपने बैश स्क्रिप्ट में फॉर लूप और व्हाइल लूप का उपयोग कर सकते हैं। बैश फॉर लूप फॉर लूप का सिंटैक्स है:for VARIABLE in PARAM1 PARAM2 PARAM3 do // फॉर लूप का स्कोप done

  1. Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

    हाल ही में मैं एक शेल स्क्रिप्ट पर काम कर रहा था और मैंने देखा कि bash स्पेशल वेरिएबल $$ और $BASHPID कैसे व्यवहार करते हैं, इसमें एक महत्वपूर्ण अंतर है। लिनक्स में चलने वाली हर प्रोसेस को एक प्रोसेस ID असाइन किया जाता है और इस तरह ऑपरेटिंग सिस्टम प्रोसेस को संभालता है। संबंधित पढ़ें: Bash में Sourc

  1. jm-shell: विस्तृत गतिविधि लॉग्स के साथ सुविधा-संपन्न, अनुकूलन योग्य बैश शेल jm-shell: विस्तृत गतिविधि लॉग्स के साथ सुविधा-संपन्न, अनुकूलन योग्य बैश शेल

    jm-shell एक मुफ्त ओपन सोर्स, छोटा, अत्यधिक जानकारीपूर्ण और अनुकूलित बैश शेल है, जो आपको अपनी शेल गतिविधि के साथ-साथ कुछ उपयोगी सिस्टम जानकारी जैसे सिस्टम लोड एवरेज, लैपटॉप/कंप्यूटर की बैटरी स्थिति और बहुत कुछ के बारे में जानकारी का खजाना देता है। महत्वपूर्ण रूप से, Bash के विपरीत जो केवल हिस्ट्री फ़