DanLevy.net

क्विज: बैश और शेल महारत

क्या आप कंप्यूटरों से बात कर सकते हैं? ठीक‑ठाक?

इन 16 प्रश्नों के साथ अपनी Bash स्क्रिप्टिंग क्षमताओं को परखें!

वेरिएबल्स, लूप्स, कंडीशनल्स, स्ट्रिंग मैनिपुलेशन, फ़ंक्शन्स और बेसिक‑से‑ट्रिकी सिंटैक्स गॉटचेज़ को कवर करते हुए।

अपनी शेल स्क्रिप्टिंग कौशल को तेज़ (या साबित) करें!

Bash में वेरिएबल्स कैसे परिभाषित किए जाते हैं?

Bash में वेरिएबल्स = चिह्न के आसपास स्पेस के बिना घोषित किए जाते हैं। उदाहरण के लिए:

Terminal window
name=Alice

यह name वेरिएबल को मान "Alice" असाइन करता है।

नोट: $name का उपयोग reference या वेरिएबल का मान पढ़ने के लिए किया जाता है।

स्पेस जोड़ने से शेल कमांड को चलाने वाले प्रोग्राम के रूप में समझता है, जो वेरिएबल सेट करते समय आप नहीं चाहते।

साथ ही, Bash केस-सेंसिटिव है, इसलिए name, NAME और Name अलग वेरिएबल हैं।

अंत में, वेरिएबल के नाम में स्पेस या डैश (-) नहीं हो सकते। अंडरस्कोर (_) या camelCase का उपयोग करें।

It's 🔨 Time! को क्या प्रिंट करेगा?

मैं जानता हूँ। यह पागलपन है कि एस्केपिंग कितनी जल्दी स्ट्रिंग्स को समझना कठिन बना देती है। सोचिए Bash स्ट्रिंग्स में अन्य भाषाओं को एस्केप करना - सभी कोट्स, अपॉस्ट्रोफ़ और $ सिंबल जो आपको परेशान कर देते हैं। 🫠

सिंगल कोट्स को सिंगल‑कोटेड स्ट्रिंग्स के भीतर एस्केप करना पड़ता है। क्लोज‑कोट, एस्केप्ड‑कोट, री‑ओपन‑कोट सीक्वेंस ('\'') आउटपुट देता है:

It's 🔨 Time!

ऐसे और भी तरीके हैं, लेकिन यह सबसे आम है।

इस कमांड का आउटपुट क्या होगा?

Terminal window
echo c{a,b}t

{} ब्रैस विस्तार उसके स्ट्रिंग संदर्भ के कई संस्करण बनाता है, प्रत्येक कॉमा‑सेपरेटेड मान या पैटर्न के लिए एक (या अधिक)।

यहाँ, c{a,b}t विस्तारित होता है:

cat cbt

अब, यह क्या प्रिंट करेगा?

Terminal window
price="$100"
echo "Cost: $price"

संख्यात्मक वेरिएबल्स का विशेष अर्थ होता है। इस मामले में, $1 एक विशेष वेरिएबल है जो स्क्रिप्ट या फ़ंक्शन को पास किए गए पहले आर्ग्यूमेंट को रखता है।

चूँकि हम स्क्रिप्ट को REPL में चला रहे हैं, कोई आर्ग्यूमेंट नहीं है, इसलिए $1 खाली है। शेष टेक्स्ट 00 जैसा है वैसा ही प्रिंट होता है।

एक लिटरल $ कैरेक्टर प्रिंट करने के लिए, सिंगल कोट्स का उपयोग करें, या बैकस्लैश (\) से एस्केप करें:

Terminal window
price="\$100"
echo "Cost: $price"

यहाँ क्या हो रहा है?

Terminal window
str="Bark bark"
echo ${str/bark/meow}

${var/pattern/replacement} सिंटैक्स pattern की पहली उपस्थिति को replacement से बदलता है। यहाँ, आउटपुट है:

Bark meow

यह केस-सेंसिटिव है। bark और Bark दोनों को संभालने के लिए ${var/[Bb]ark/Bark} जैसा पैटर्न उपयोग करें या प्रतिस्थापन से पहले स्ट्रिंग को सामान्य करें।

सभी उपस्थिति बदलने के लिए ${var//pattern/replacement} उपयोग करें।

स्ट्रिंग की शुरुआत से बदलने के लिए ${var/#pattern/replacement} उपयोग करें।

स्ट्रिंग के अंत से बदलने के लिए ${var/%pattern/replacement} उपयोग करें।

Bash में किसी वेरिएबल की लंबाई कैसे प्राप्त करें?

${#username} सिंटैक्स username की लंबाई लौटाता है।

उदाहरण के लिए:

Terminal window
username="@justsml"
echo ${#username} # => 8

wc काम कर सकता है, लेकिन यह तकनीकी रूप से Bash का हिस्सा नहीं है।

यूटिलिटी wc एक पुराना अंदरूनी मज़ाक है जिसका मतलब “वॉटर क्लोसेट” यानी टॉयलेट है। मज़ाक कर रहा हूँ! क्या कोई इसे पढ़ता है?

असल में wc Posix (और AT&T Unix दिनों) से आया एक प्राचीन कमांड है। यह “word count” का संक्षिप्त रूप है और फ़ाइल या इनपुट स्ट्रीम में लाइनों, शब्दों और अक्षरों की गिनती कर सकता है।

यदि फ़ाइल cats.txt मौजूद है तो यह स्क्रिप्ट क्या आउटपुट देती है?

Terminal window
if [ -e cats.txt]; then
echo "File exists"
else
echo "File does not exist"
fi

क्या आपने बंद ब्रैकेट से पहले की गायब स्पेस देखी?

Bash यहाँ काफी संवेदनशील है: ब्रैकेट अभिव्यक्तियों के अंदर स्पेस आवश्यक हैं.

क्योंकि गायब स्पेस के कारण [ कमांड को कोई बंद ] नहीं दिखता, Bash एक निदान प्रिंट करता है, परीक्षण को विफल मानता है, और else शाखा पर जाता है.

सही सिंटैक्स है:

Terminal window
if [ -e example.txt ]; then
echo "File exists"
else
echo "File does not exist"
fi

ध्यान दें: डबल ब्रैकेट [[ ]] शर्तीय अभिव्यक्तियों के लिए सिफारिश किए जाते हैं। देखें BashFAQ.

Bash में स्ट्रिंग्स की तुलना कैसे करें?

Terminal window
cat1="Rosie"
cat2="Sunflower"
if [ "$cat1" === "$cat2" ]; then
echo "Same cat"
else
echo "Different cats"
fi

एक और परीक्षण सिंटैक्स त्रुटि!

क्या आपने अमान्य === ऑपरेटर को पकड़ा?

आप शायद जावास्क्रिप्ट के बारे में सोच रहे थे…

[ ... ] के साथ, Bash एक डायग्नोस्टिक रिपोर्ट करता है और शर्त गलत होती है, इसलिए else शाखा Different cats प्रिंट करती है। Bash में, समानता तुलना के लिए = या == का उपयोग करें।

इस स्क्रिप्ट का आउटपुट क्या होगा?

Terminal window
function greet () {
echo "$1"
}
greet Hi Dan

Bash में फ़ंक्शन तर्क ले सकते हैं। $1 वेरिएबल फ़ंक्शन को पास किए गए पहले तर्क को रखता है.

याद रखें, $0 स्क्रिप्ट का नाम है, $1 पहला तर्क, $2 दूसरा, आदि. स्पेस तर्कों को अलग करता है। इसलिए, greet Hi Dan पहला तर्क "Hi" पास करता है। "Hi Dan" को एक ही तर्क के रूप में पास करने के लिए, आपको इसे कोट करना होगा: greet "Hi Dan".

कौन सा ऑपरेटर एक कमांड के आउटपुट को अगले कमांड के इनपुट से जोड़ता है?

| पाइप ऑपरेटर एक कमांड के आउटपुट को दूसरे के इनपुट से जोड़ता है। उदाहरण के लिए:

Terminal window
echo "Mr. Levy 👨🏻‍🔬" | wc -m
# => 14

Bash में गणित कैसे काम करता है?

Bash में (( )) सिंटैक्स पूर्णांक गणित करता है।

इसे सरल गणनाओं के लिए उपयोग किया जा सकता है:

Terminal window
((result = 2 + 2))
echo $result # => 4

या शर्तीय अभिव्यक्तियों के लिए:

Terminal window
if (( 2 > 1 )); then
echo "2 is greater than 1"
fi

फ़्लोटिंग‑पॉइंट अंकगणित के लिए, bc या awk का उपयोग करने पर विचार करें।

इनमें से कौन सा सही ढंग से 10 और 0.5 को गुणा करता है, और 5 प्रिंट करता है?

(( )) सिंटैक्स केवल इंटीजर अंकगणित करता है। यानी पूरी संख्याएँ, कोई फ्लोटिंग पॉइंट नहीं!

Bash (शायद आश्चर्यजनक) में बिल्ट‑इन फ्लोटिंग‑पॉइंट अंकगणित का समर्थन नहीं है।

सबसे आम समाधान है GNU यूटिलिटीज़ bc या awk का उपयोग करना।

इस स्क्रिप्ट में : क्या करता है?

Terminal window
rosie="Bad cat, good cat"
echo ${rosie:9}

${var:offset} सिंटैक्स offset से शुरू होने वाली सबस्ट्रिंग निकालता है। यहाँ, आउटपुट है:

good cat

विशिष्ट लंबाई की सबस्ट्रिंग निकालने के लिए, ${var:offset:length} का उपयोग करें।

स्ट्रिंग के अंत से निकालने के लिए, ${var: -offset} का उपयोग करें। (ध्यान दें - से पहले स्पेस है!)

Bash में लूपिंग के लिए कौन सा शब्द ❌ कीवर्ड नहीं है?

each Bash में लूप कीवर्ड नहीं है। मुख्य लूप कीवर्ड हैं for, while, और until.

जबकि do तकनीकी रूप से लूप कीवर्ड नहीं है, यह लूप सिंटैक्स का एक महत्वपूर्ण हिस्सा है।

कौन सा विकल्प कमांड ls -l को चलाएगा और आउटपुट लौटाएगा?

$(ls -l) सिंटैक्स कमांड को कोष्ठकों के भीतर चलाता है और आउटपुट को प्रतिस्थापित करता है। उदाहरण के लिए:

Terminal window
echo "Today is $(date +%F)"
# => Today is 2029-12-31

पहला विकल्प सिंगल कोट ' का उपयोग करता है, बैकटिक नहीं। यह विस्तार को रोकता है, इसलिए '$(date +%F)' केवल स्ट्रिंग $(date +%F) को ही प्रिंट करेगा।

जबकि बैकटिक (`ls -l`) का उपयोग अभी भी समर्थित है कमांड चलाने के लिए, यह हाल ही में कुछ संदर्भों में एक एंटी‑पैटर्न बन गया है। अधिकांश लोग बेहतर पठनीयता और विभिन्न शैलों व संस्करणों के साथ संगतता के लिए $(command) का उपयोग करने की सलाह देते हैं।

कर्ली ब्रेसेस ${} वेरिएबल विस्तार के लिए उपयोग होते हैं, कमांड प्रतिस्थापन के लिए नहीं।

% कैरेक्टर कमांड प्रतिस्थापन के लिए उपयोग नहीं होता।

कौन सा ऑपरेटर त्रुटि आउटपुट को मानक आउटपुट के साथ मिलाने के लिए उपयोग किया जाता है?

2>&1 ऑपरेटर मानक त्रुटि (फ़ाइल डिस्क्रिप्टर 2) को मानक आउटपुट (फ़ाइल डिस्क्रिप्टर 1) की ओर पुनर्निर्देशित करता है। यह सामान्य आउटपुट के समान स्ट्रीम में त्रुटि संदेशों को कैप्चर करने में उपयोगी है।

1>&2 ऑपरेटर मानक आउटपुट को मानक त्रुटि की ओर पुनर्निर्देशित करता है, लेकिन प्रश्न ने बताया था कि मानक त्रुटि को मानक आउटपुट की ओर कैसे पुनर्निर्देशित किया जाए।

अधिक जानने के लिए कि पीछे क्या हो रहा है, देखें Greg का उत्कृष्ट रीडायरेक्शन FAQ

साथ ही, Reddit उपयोगकर्ता u/OneTurnMore को सुझाए गए कॉपी सुधारों के लिए धन्यवाद।

क्या मेरी Bash क्विज़ ने आपको बिखेर दिया?

नीचे कमेंट्स में बताइए!

आगे पढ़ें

इन संसाधनों के साथ अपनी Bash कौशल को ताज़ा करें: