बैश स्क्रिप्टिंग में, डिक्लेयर और सामान्य वेरिएबल के बीच क्या अंतर है?


43

बैश स्क्रिप्टिंग में:

हम इसका नामकरण करके परिवर्तनशील बनाते हैं:

abc=ok

या हम उपयोग कर सकते हैं declare

declare abc=ok

क्या फर्क पड़ता है?

और बैश एक चर बनाने के लिए इतने सारे तरीके क्यों बनाता है?


6
जब किसी फ़ंक्शन में उपयोग किया जाता है declare, localकमांड के साथ NAME को स्थानीय बनाता है । -gविकल्प इस व्यवहार को रोकता है। देख लो help declare
सायरस

2
declareसाहचर्य सरणियों, पूर्णांक, और केवल-पढ़ने योग्य चर बनाना संभव बनाता है। इसके अलावा, यह अपने तर्कों का विस्तार करता है, इसलिए जैसी चीजें declare $name=1संभव हैं।
चेरोबा

जवाबों:


34

से help -m declare:

नाम

    declare - चर मान और गुण सेट करें।

SYNOPSIS

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

विवरण

    चर मान और गुण सेट करें।

    चरों को घोषित करें और उन्हें विशेषताएँ दें। यदि कोई NAME नहीं दिया जाता है, तो सभी चर की विशेषताओं और मूल्यों को प्रदर्शित करें।

    विकल्प:

      -f
        नाम और परिभाषाएँ कार्य करने के लिए कार्रवाई या प्रदर्शन को प्रतिबंधित करें
      -F
        प्रदर्शन नामों को केवल प्रतिबंधित करें (डीबगिंग के दौरान प्लस लाइन नंबर और स्रोत फ़ाइल)
      -g
        शेल फ़ंक्शन में उपयोग किए जाने पर वैश्विक चर बनाएं; अन्यथा नजरअंदाज कर दिया
      -p
        प्रत्येक NAME की विशेषताएँ और मूल्य प्रदर्शित करें

    विकल्प जो विशेषताएँ निर्धारित करते हैं:

      -a
        NAME को अनुक्रमित सरणियाँ बनाने के लिए (यदि समर्थित हो)
      -A
        NAME की सहयोगी सरणियाँ बनाना (यदि समर्थित हो)
      -i
        NAME बनाने के लिए 'पूर्णांक' विशेषता है
      -l
        NAME को असाइनमेंट पर निम्न स्थिति में बदलने के लिए
      -n
        NAME को उसके मान द्वारा नामित चर का संदर्भ दें
      -r
        NAME को आसानी से बनाने के लिए
      -t
        NAME बनाने के लिए 'ट्रेस' विशेषता है
      -u
        असाइनमेंट पर NAME को ऊपरी मामले में बदलने के लिए
      -x
        NAME को निर्यात करने के लिए

    दिए गए विशेषता को बंद +करने के बजाय ' ' का उपयोग करना -

    पूर्णांक विशेषता वाले वेरिएबल्स में अंकगणित मूल्यांकन होता है ( letकमांड देखें ) जब चर को एक मान दिया जाता है।

    जब किसी फ़ंक्शन में उपयोग किया जाता है declare, local कमांड के साथ NAME को स्थानीय बनाता है । ' -g' विकल्प इस व्यवहार को दबा देता है।

    स्थिति से बाहर निकलें:
    जब तक कि एक अवैध विकल्प की आपूर्ति नहीं होती है या एक चर असाइनमेंट त्रुटि होती है, तब तक सफलता मिलती है।

यह सभी देखें

    बैश (1)

कार्यान्वयन

    GNU बैश, संस्करण 4.3.11 (1) -release (i686-pc-linux-gnu)
    कॉपीराइट (C) 2013 फ्री सॉफ्टवेयर फाउंडेशन, Inc.
    लाइसेंस GPLv3 +: GNU GPL संस्करण 3 या बाद में <http://gnu.org लाइसेंस / gpl.html>


तो, declareचर मूल्यों और विशेषताओं को स्थापित करने के लिए उपयोग किया जाता है ।

मुझे बहुत सरल उदाहरण के साथ दो विशेषताओं का उपयोग दिखाने दें:

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20

उपरोक्त उदाहरण से, मुझे लगता है कि आपको declareसामान्य चर पर चर के उपयोग को समझना चाहिए ! इस प्रकार का declareप्याज कार्यों में उपयोगी है, स्क्रिप्टिंग के साथ छोरों।

टाइपिंग चर भी देखें : घोषित करें या टाइप करें


हाँ, "और गुण" बिंदु है! यह अंतर है।
प्रेम'

महान! मुझे उदाहरण मिलते हैं, सिखाने / सीखने का सबसे अच्छा तरीका। धन्यवाद!
टर्कनह

1
आपको यह जानने की जरूरत है कि इस उत्तर को समझने के लिए "विशेषताएँ" क्या हैं। वे 'पूर्णांक', 'सरणी', या 'आसानी से' जैसे चर के गुण हैं।
नौमेनन

11

abc=okवैरिएबल को एक मान प्रदान करता है abcdeclare abcएक चर घोषित करता है abc। दोनों को एक साथ जोड़ा जा सकता है declare abc=ok

बैश में, अन्य गोले की तरह, स्ट्रिंग और एरे चर को घोषित करने की आवश्यकता नहीं होती है, इसलिए declareयह आवश्यक नहीं है जब तक कि आप विकल्प पारित नहीं करना चाहते हैं, उदाहरण declare -A abcके लिए abcएक साहचर्य सरणी declare -rबनाने के लिए या केवल एक चर पढ़ने के लिए। हालाँकि, किसी फ़ंक्शन के अंदर, declareइससे फर्क पड़ता है: यह वेरिएबल को फ़ंक्शन के लिए स्थानीय बनाता है, जिसका अर्थ है कि फ़ंक्शन के बाहर वेरिएबल का मान (यदि कोई हो) संरक्षित है। (जब तक आप उपयोग नहीं करते हैं declare -g, जो चर को स्थानीय नहीं बनाता है; यह तब उपयोगी होता है जब अन्य विकल्पों के साथ संयुक्त होता है, उदाहरण के declare -gAलिए किसी फ़ंक्शन में वैश्विक साहचर्य सरणी बनाने के लिए।) उदाहरण:

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"

आउटपुट:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f

declareबिलिन के साथ एक और चीज आप कर सकते हैं

declareBuiltin बैश के लिए अद्वितीय है। यह दृढ़ता से प्रेरित है और ksh के बिल्डिन के बहुत करीब है typeset, और बैश संगतता के typesetपर्याय के रूप में प्रदान करता है declare। (मुझे नहीं पता कि क्यों बैश ने इसे कॉल नहीं किया typeset)। एक तीसरा पर्यायवाची है local,। वहाँ भी है export, जो एक ही है declare -x, फिर से संगतता के लिए (हर बॉर्न-शैली शेल के साथ)।


हाँ! 'और विकल्प' बिंदु है। पीएस अगर मैं बैश डिजाइन करता हूं, तो मैं "घोषणा" के व्यवहार को अलग-अलग तरीके से करने की अनुमति दूंगा। इससे चीजें सरल होती हैं।
१२

अच्छा जवाब। एक और सवाल, जो एक के बीच है export, localऔर declareअन्य गोले के साथ सबसे अधिक संगत है?
0xc0de

1
@ 0xc0de exportसभी प्रकारों में मौजूद है shlocalकेवल बैश और zsh में मौजूद है, declareकेवल bash में। typesetksh, bash और zsh में मौजूद है।
गिल्स एसओ- बुराई का होना बंद करो '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.