Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

बैश और शेल विस्तार:आलसी सूची बनाना

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

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

ब्रेस एक्सपेंशन

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

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

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

ब्रेसिज़ बैश को उनके बीच पाए जाने वाले मनमाने तार या तार के साथ कुछ करने के लिए कहते हैं। एकाधिक तार अल्पविराम से अलग होते हैं:{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

ओह डर्न, "ब्रायन" ने अपना नाम "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 . को नहीं बदलता है परिवर्तनशील, इसलिए हम बाद में किसी शरारती व्यक्ति के लिए मूल सूची का पुन:उपयोग कर सकते हैं।

सबस्ट्रिंग

जबकि हम चीजों में सुधार कर रहे हैं, हो सकता है कि हमारे उपहार देने वाले सभी व्हाइट चॉकलेट पसंद न करें। बेहतर होगा कि हम अपनी सूची में कुछ नियमित चॉकलेट को शामिल करें। चूंकि मैं बहुत आलसी हूं, मैं बस ऊपर तीर मारने जा रहा हूं और पिछले बैश कमांड को संशोधित कर रहा हूं। सौभाग्य से, $STUFF . में अंतिम शब्द चर "चॉकलेट" है, जो नौ वर्ण लंबा है, इसलिए मैं बैश को ${parameter:offset} का उपयोग करके बस उस हिस्से को रखने के लिए कहूंगा . मैं tee का उपयोग करूंगा/करूंगी का -a 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}
x के लिए सबस्ट्रिंग प्राप्त करें n . से शुरू होने वाले वर्ण ${parameter:n:x}

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

परीक्षण चर

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

echo "${amy:?no such}"

bash: amy: no such

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

echo "${brian:?no such}"

Lederhosen

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

ऐसा करें इसके साथ
स्थानापन्न word अगर parameter सेट नहीं है या शून्य है ${parameter:-word}
स्थानापन्न word अगर parameter परेशान या शून्य नहीं है ${parameter:+word}
असाइन करें word parameter . के लिए अगर 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

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


  1. लूप के लिए बैश और जबकि लूप उदाहरण

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

  1. बश में $$ और $BASHPID के बीच अंतर जानें

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

  1. जेएम-शेल - एक अत्यधिक जानकारीपूर्ण और अनुकूलित बैश शैल

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