ट्रैक
/
Bash
Bash
/
सिलेबस
/
वेरिएबल
वे

वेरिएबल में Bash

{one: "1 अभ्यास", other: "%{count} अभ्यास"}

वेरिएबल के बारे में

वेरिएबल

वेरिएबल डेटा रखने की जगह हैं। bash में दो तरह का डेटा होता है: स्ट्रिंग और ऐरे। ऐरे के बारे में हम बाद में बात करेंगे।

किसी वेरिएबल को आप ऐसे असाइन करते हैं

name="value"
Note

ज़रूरी बात -- बराबर के चिह्न के आस-पास कोई स्पेस नहीं होना चाहिए!

जब वहाँ स्पेस हों, जैसे इस उदाहरण में,

x = 10

तो bash x नाम की कमांड को दो आर्गुमेंट = और 10 देकर चलाता है!

वेरिएबल को पैरामीटर भी कहा जाता है। इस दस्तावेज़ में इन दोनों शब्दों का प्रयोग एक ही अर्थ में किया गया है।

bash जिन कुछ खास पैरामीटर का उपयोग करता है या जिन्हें खुद सेट करता है, वे ये हैं:

  • PATH -- बाहरी कमांड ढूँढने के लिए इस्तेमाल होने वाली डायरेक्टरियों की सूची, जिनके बीच कोलन लगा होता है।
  • IFS -- यानी "आंतरिक फील्ड सेपरेटर"। यह कैसे इस्तेमाल होता है, यह हम नीचे देखेंगे।
  • PWD -- आपकी वर्तमान वर्किंग डायरेक्टरी। इसकी वैल्यू वही होगी जो pwd कमांड का आउटपुट देता है।
  • RANDOM -- 0 और 32767 के बीच का एक स्यूडो-रैंडम पूर्णांक।
  • BASH_VERSION -- चल रहे bash इंस्टेंस की वर्ज़न स्ट्रिंग।

वेरिएबल के नाम

वेरिएबल का नाम बड़े अक्षरों, छोटे अक्षरों, संख्याओं और अंडरस्कोर से बना होता है। नाम की शुरुआत किसी संख्या से नहीं हो सकती।

Caution

किसी वेरिएबल का नाम पूरे बड़े अक्षरों में रखने से बचना ही सबसे अच्छा तरीका है। शेल अपने पैरामीटर के लिए यही तरीका अपनाता है, और आप नहीं चाहेंगे कि गलती से ऐसे शेल पैरामीटर के ऊपर लिख दें जिनका कोई खास मतलब हो। उदाहरण के लिए: 1, 2, 3

पैरामीटर एक्सपैंशन

किसी पैरामीटर की वैल्यू आप $varname सिंटैक्स से पाते हैं।

x=10
echo "The value of x is $x"

वेरिएबल का नाम आस-पास के टेक्स्ट के साथ मिलकर न पढ़ा जाए, इसके लिए आप नाम को घुंघराले ब्रैकेट में लिख सकते हैं। उदाहरण के लिए, स्ट्रिंग 10x10 प्रिंट करने के लिए

echo "${x}x$x"
# or
echo "${x}x${x}"

कुछ स्टाइल गाइड पढ़ने में आसानी और एकरूपता के लिए ज़्यादातर जगहों पर ब्रैकेट इस्तेमाल करने की सलाह देते हैं।

पोज़िशनल पैरामीटर

कमांड और आर्गुमेंट पाठ में हमने देखा था कि कमांड आर्गुमेंट ले सकती हैं। bash स्क्रिप्ट भी इसका अपवाद नहीं हैं। bash का जो इंस्टेंस अभी चल रहा है, उसे मिलने वाले आर्गुमेंट को पोज़िशनल पैरामीटर कहते हैं। इन्हें इन खास पैरामीटर से निकाला जा सकता है:

  • $1 -- पहला पोज़िशनल पैरामीटर
  • $2 ... $9 -- इसके बाद के पैरामीटर
  • ${10} ... -- दो अंकों वाले नामों के लिए घुंघराले ब्रैकेट ज़रूरी हैं।
  • $0 -- अभी चल रही स्क्रिप्ट का नाम।

शेल फंक्शन को दिए जाने वाले आर्गुमेंट भी पोज़िशनल पैरामीटर होते हैं, और उन्हें भी इसी तरह संभाला जाता है। फंक्शन के बारे में हम आगे किसी पाठ में और जानेंगे।

खास पोज़िशनल पैरामीटर

कुछ खास पैरामीटर हैं जो पोज़िशनल पैरामीटर के साथ काम करने में आपकी मदद करते हैं।

  • $# पोज़िशनल पैरामीटर की संख्या देता है।
  • "$@" सभी पोज़िशनल पैरामीटर की सूची देता है, जिसमें हर एक अलग शब्द होता है।
  • "$*" सभी पोज़िशनल पैरामीटर को एक अक्षर से जोड़कर बनी एक ही स्ट्रिंग देता है।
    • जोड़ने वाला अक्षर $IFS वेरिएबल का पहला अक्षर होता है, जो डिफॉल्ट रूप से एक स्पेस होता है।

पोज़िशनल पैरामीटर को सुरक्षित कोट में रखते हुए किसी दूसरी कमांड तक पहुँचाने का सबसे भरोसेमंद तरीका "$@" है। पोज़िशनल पैरामीटर पर लूप चलाने के लिए भी आप इसी का उपयोग करेंगे:

for arg in "$@"; do
    do_something_with "$arg"
done

व्यवहार में "$*" की तुलना में "$@" का इस्तेमाल ज़्यादा होता है।

कमांड सब्स्टिट्यूशन

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

var=$(command)

उदाहरण के लिए, किसी स्ट्रिंग को बड़े अक्षरों में बदलने के लिए आप यह कर सकते हैं:

text="Hello world!"
uppercase=$(echo "$text" | tr '[:lower:]' '[:upper:]')
echo "$uppercase"
# => HELLO WORLD!

पैरामीटर एक्सपैंशन के बारे में और

bash में वेरिएबलों और स्ट्रिंग पर काम करने की कई बिल्ट-इन सुविधाएँ हैं, जिससे आपको बाहरी कमांड बुलाने की ज़रूरत नहीं पड़ती।

  • टेक्स्ट को बड़े अक्षरों में बदलना। पिछले भाग में मैंने दिखाया था कि किसी टेक्स्ट को tr से बड़े अक्षरों में कैसे बदलते हैं। bash में यह ऐसे करते हैं:

    echo "${text^^}"
    

    इसी तरह, ${text,,} वैल्यू को छोटे अक्षरों में बदल देता है।

  • अगर वेरिएबल खाली हो तो कोई डिफॉल्ट वैल्यू देना।

    default="nothing here"
    result=""
    echo "${result:-$default}"
    # => nothing here
    
  • खोजना और बदलना।

    text="Hello world!"
    echo "${text//[aeiou]/X}"
    # => HXllX wXrld!"
    

ऐसे और भी कई दिलचस्प पैरामीटर एक्सपैंशन हैं: कोई सबस्ट्रिंग निकालना, स्ट्रिंग की लंबाई पता करना, किसी डिफॉल्ट वैल्यू को असाइन करना, वैल्यू के शुरू या अंत से टेक्स्ट हटाना, और भी बहुत कुछ। इनके बारे में मैनुअल में पढ़िए।

GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।