कहें कि मैंने निम्नलिखित चर बनाए हैं:
s=John
i=12345
f=3.14
क्या ये सभी चर स्मृति में स्ट्रिंग के रूप में संग्रहीत हैं, या bashअन्य डेटा प्रकार हैं?
कहें कि मैंने निम्नलिखित चर बनाए हैं:
s=John
i=12345
f=3.14
क्या ये सभी चर स्मृति में स्ट्रिंग के रूप में संग्रहीत हैं, या bashअन्य डेटा प्रकार हैं?
जवाबों:
बैश चरों को अप्रकाशित किया जाता है ।
कई अन्य प्रोग्रामिंग भाषाओं के विपरीत, बैश इसके प्रकारों को "प्रकार" से अलग नहीं करता है। अनिवार्य रूप से, बैश चर वर्ण तार होते हैं, लेकिन, संदर्भ के आधार पर, बैश अंकगणितीय संचालन और चर की तुलना की अनुमति देता है। निर्धारण कारक यह है कि क्या एक चर के मूल्य में केवल अंक होते हैं।
जैसा कि एक अन्य जवाब में कहा गया है , टाइपिंग का कमजोर रूप है declare।
यह कुछ प्रोग्रामिंग भाषाओं में उपलब्ध टाइपिंग [1] का एक बहुत ही कमजोर रूप है।
एक उदाहरण देखें:
declare -i number # The script will treat subsequent occurrences of "number" as an integer. number=3 echo "Number = $number" # Number = 3 number=three echo "Number = $number" # Number = 0 # Tries to evaluate the string "three" as an integer.
संदर्भ:
बैश में अनिवार्य रूप से सादे स्केलर चर, सरणियाँ, और साहचर्य सरणियाँ होती हैं। इसके अलावा, scalars साथ पूर्णांकों के रूप में चिह्नित किया जा सकता है declareनिर्मित । स्क्रिप्ट प्रोग्रामर / शेल उपयोगकर्ता के दृष्टिकोण से, स्ट्रिंग चर स्ट्रिंग के रूप में कार्य करते हैं, पूर्णांक चर पूर्णांक के रूप में कार्य करते हैं, और उनके प्रकार के अनुसार सरणियाँ होती हैं। आंतरिक कार्यान्वयन बहुत प्रासंगिक नहीं है।
लेकिन, अगर हम यह जानना चाहते हैं कि डेटा वास्तव में मेमोरी में कैसे संग्रहीत किया जाता है, तो हमें यह देखने के लिए कि वास्तव में क्या कार्यक्रम है, स्रोत कोड की जांच करनी चाहिए।
बैश 4.4 में, पूर्णांक टैग की परवाह किए बिना, स्केलर को स्ट्रिंग्स के रूप में संग्रहीत किया जाता है। यह / typedef और फ़ंक्शन की परिभाषाstruct variableSHELL_VAR में दिखाई देता है , जो स्पष्ट रूप से संग्रहण के लिए पूर्णांक का अनुवाद करता है।make_variable_value
Arrays एक जुड़ी हुई सूची ( array.h), और हैश टेबल के रूप में साहचर्य सरणियों के रूप में संग्रहीत किया जाता है । उनके भीतर के मूल्यों को फिर से तार के रूप में संग्रहीत किया जाता है। सरणियों के लिए एक लिंक की गई सूची का चयन अजीब लग सकता है, लेकिन जैसा कि सरणियों को विरल किया जा सकता है, और अनुक्रमणिका मनमाने ढंग से संख्या हो सकती है, भले ही कुछ तत्व कितने भी हों, उस डिज़ाइन की पसंद को समझना थोड़ा आसान है।
हालाँकि, कोड में अप्रयुक्त केunion _value लिए एक परिभाषा भी होती है , जिसमें पूर्णांक संख्या, फ्लोटिंग पॉइंट संख्या, साथ ही स्ट्रिंग मान के लिए फ़ील्ड होते हैं। इसे एक टिप्पणी में "भविष्य के लिए" के रूप में चिह्नित किया गया है, इसलिए यह संभव है कि बैश के कुछ भविष्य के संस्करण विभिन्न प्रकार के स्केलर को उनके मूल रूपों में संग्रहीत करेंगे।
मेरे जीवन के लिए मैं इसे इतने सारे शब्दों में कहीं भी नहीं कह सकता लेकिन यह है कि मैं इसे कैसे समझता हूं।
बैश एक दुभाषिया है, एक संकलक नहीं है और तार के रूप में सभी चर का प्रतिनिधित्व करता है। इसलिए सभी प्रयास और जोर जो विभिन्न प्रकार के विस्तार के साथ जाते हैं।
बैश गुजरता गुजरता सभी के लिए नामित चरों declareके साथ तारों के रूप में गुण है कि चर किया जा रहा है कैसे है कि नियंत्रण का विस्तार से declareभंडारण पर।
banana=yellow #no call to declare
declare -p banana
declare -- banana="yellow" #but declare was invoked with --
declare -i test=a #arithmetic expansion to null/zero
declare -p test
declare -i test="0"
declare -i test2=5+4 #successful arithmetic expansion
declare -p test2
declare -i test2="9"
declare -i float=99.6 #arithmetical expansion fails due to syntax
bash: declare: 99.6: syntax error: invalid arithmetic operator (error token is ".6")
nofloat=99.9
declare -p nofloat
declare -- nofloat"99.6" #Success because arithmetical expansion not invoked
declare -a a #variable is marked as a placeholder to receive an array
declare -p a
declare -a a
a[3]=99 #array elements are appended
a[4]=99
declare -p a
declare -a a=([3]="99" [4]="99")
declare -A newmap #same as -a but names instead of numbers
newmap[name]="A Bloke"
newmap[designation]=CFO
newmap[company]="My Company"
declare -p newmap
declare -A newmap=([company]="My Company" [name]="A Bloke" [designation]="CFO" )
और निश्चित रूप से
declare -ia finale[1]=9+16
declare -p finale
declare -ai finale=([1]="25")
यह करने के लिए कोडा है कि भले ही declareएक आंतरिक प्रतिनिधित्व है जो विशेषता झंडे के साथ बदलता है, तार सभी हैं जो बैश देखता है या देखना चाहता है।
इस पृष्ठ में बैश में टाइपिंग चर पर एक व्यापक गाइड है । इस खंड में declareअंतर्निहित कमांड पर अधिक जानकारी है । उस लिंक से यह कोड स्निपेट ब्याज की हो सकती है:
[bob in ~] declare -i VARIABLE=12
[bob in ~] VARIABLE=string
[bob in ~] echo $VARIABLE
0
[bob in ~] declare -p VARIABLE
declare -i VARIABLE="0"
यह अप्रासंगिक है।
बैश वेरिएबल्स के साथ बातचीत करने का एकमात्र तरीका बैश के माध्यम से है, इसलिए आपके लिए किसी भी अंतर को नोटिस करना असंभव है कि चर मेमोरी में कैसे संग्रहीत किए जाते हैं, क्योंकि आप उन्हें सीधे मेमोरी के माध्यम से एक्सेस नहीं कर सकते हैं , आपको हमेशा उनके लिए बैश पूछने की आवश्यकता है मूल्य, और बैश तो जो कुछ भी जिस तरह से यह करना चाहता है में उन्हें अनुवाद कर सकते हैं देखने के रूप में यदि वे था किसी भी विशिष्ट तरीके से संग्रहित किया गया।
वास्तव में, वे भी स्मृति में संग्रहीत नहीं किया जा सकता है । मुझे नहीं पता कि बाश के सामान्य कार्यान्वयन कितने चतुर हैं, लेकिन यह सरल मामलों में कम से कम संभव है कि यह निर्धारित किया जाए कि एक चर का उपयोग किया जाएगा और / या क्या इसे संशोधित किया जाएगा, और इसे पूरी तरह से अनुकूलित करें या इसे इनलाइन करें।
bash)।