क्या मेमोरी में सभी वैरिएबल को स्ट्रिंग के रूप में स्टोर किया जाता है?


14

कहें कि मैंने निम्नलिखित चर बनाए हैं:

s=John
i=12345
f=3.14

क्या ये सभी चर स्मृति में स्ट्रिंग के रूप में संग्रहीत हैं, या bashअन्य डेटा प्रकार हैं?


1
हित से बाहर, यह क्यों मायने रखेगा? मैं वास्तव में कम देखभाल नहीं कर सकता था यदि उन्हें स्वाहिली पाठ के रूप में संग्रहीत किया जाता था जब तक कि यह भाषा की कार्यक्षमता को प्रभावित नहीं करता था (प्रदर्शन को प्रभावित करना एक मुद्दा हो सकता है लेकिन, अगर यह महत्वपूर्ण है, तो वे आपके शस्त्रागार में बेहतर उपकरण हैं bash)।

2
@paxdiablo यह कोई फर्क नहीं पड़ता, मैं सिर्फ जिज्ञासा से बाहर पूछ रहा हूं, क्योंकि अन्य सभी प्रोग्रामिंग / स्क्रिप्टिंग भाषाएं जिन्हें मैं जानता हूं (उदाहरण के लिए: जावा, सी ++, जावास्क्रिप्ट, पीएचपी, आदि) प्रत्येक डेटा प्रकार के लिए एक अद्वितीय मेमोरी प्रतिनिधित्व है , इसलिए यह एक स्क्रिप्टिंग भाषा को देखना दिलचस्प है, जिसमें सभी डेटा प्रकारों के लिए केवल एक मेमोरी प्रतिनिधित्व है।
user268325

जवाबों:


16

बैश चरों को अप्रकाशित किया जाता है

कई अन्य प्रोग्रामिंग भाषाओं के विपरीत, बैश इसके प्रकारों को "प्रकार" से अलग नहीं करता है। अनिवार्य रूप से, बैश चर वर्ण तार होते हैं, लेकिन, संदर्भ के आधार पर, बैश अंकगणितीय संचालन और चर की तुलना की अनुमति देता है। निर्धारण कारक यह है कि क्या एक चर के मूल्य में केवल अंक होते हैं।

जैसा कि एक अन्य जवाब में कहा गया है , टाइपिंग का कमजोर रूप है 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.

संदर्भ:


13

बैश में अनिवार्य रूप से सादे स्केलर चर, सरणियाँ, और साहचर्य सरणियाँ होती हैं। इसके अलावा, scalars साथ पूर्णांकों के रूप में चिह्नित किया जा सकता है declareनिर्मित । स्क्रिप्ट प्रोग्रामर / शेल उपयोगकर्ता के दृष्टिकोण से, स्ट्रिंग चर स्ट्रिंग के रूप में कार्य करते हैं, पूर्णांक चर पूर्णांक के रूप में कार्य करते हैं, और उनके प्रकार के अनुसार सरणियाँ होती हैं। आंतरिक कार्यान्वयन बहुत प्रासंगिक नहीं है।


लेकिन, अगर हम यह जानना चाहते हैं कि डेटा वास्तव में मेमोरी में कैसे संग्रहीत किया जाता है, तो हमें यह देखने के लिए कि वास्तव में क्या कार्यक्रम है, स्रोत कोड की जांच करनी चाहिए।

बैश 4.4 में, पूर्णांक टैग की परवाह किए बिना, स्केलर को स्ट्रिंग्स के रूप में संग्रहीत किया जाता है। यह / typedef और फ़ंक्शन की परिभाषाstruct variableSHELL_VAR में दिखाई देता है , जो स्पष्ट रूप से संग्रहण के लिए पूर्णांक का अनुवाद करता है।make_variable_value

Arrays एक जुड़ी हुई सूची ( array.h), और हैश टेबल के रूप में साहचर्य सरणियों के रूप में संग्रहीत किया जाता है । उनके भीतर के मूल्यों को फिर से तार के रूप में संग्रहीत किया जाता है। सरणियों के लिए एक लिंक की गई सूची का चयन अजीब लग सकता है, लेकिन जैसा कि सरणियों को विरल किया जा सकता है, और अनुक्रमणिका मनमाने ढंग से संख्या हो सकती है, भले ही कुछ तत्व कितने भी हों, उस डिज़ाइन की पसंद को समझना थोड़ा आसान है।

हालाँकि, कोड में अप्रयुक्त केunion _value लिए एक परिभाषा भी होती है , जिसमें पूर्णांक संख्या, फ्लोटिंग पॉइंट संख्या, साथ ही स्ट्रिंग मान के लिए फ़ील्ड होते हैं। इसे एक टिप्पणी में "भविष्य के लिए" के रूप में चिह्नित किया गया है, इसलिए यह संभव है कि बैश के कुछ भविष्य के संस्करण विभिन्न प्रकार के स्केलर को उनके मूल रूपों में संग्रहीत करेंगे।


1

मेरे जीवन के लिए मैं इसे इतने सारे शब्दों में कहीं भी नहीं कह सकता लेकिन यह है कि मैं इसे कैसे समझता हूं।

बैश एक दुभाषिया है, एक संकलक नहीं है और तार के रूप में सभी चर का प्रतिनिधित्व करता है। इसलिए सभी प्रयास और जोर जो विभिन्न प्रकार के विस्तार के साथ जाते हैं।

बैश गुजरता गुजरता सभी के लिए नामित चरों 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एक आंतरिक प्रतिनिधित्व है जो विशेषता झंडे के साथ बदलता है, तार सभी हैं जो बैश देखता है या देखना चाहता है।


0

इस पृष्ठ में बैश में टाइपिंग चर पर एक व्यापक गाइड हैइस खंड में 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"

यहाँ के लिए manपृष्ठ हैdeclare


0

यह अप्रासंगिक है।

बैश वेरिएबल्स के साथ बातचीत करने का एकमात्र तरीका बैश के माध्यम से है, इसलिए आपके लिए किसी भी अंतर को नोटिस करना असंभव है कि चर मेमोरी में कैसे संग्रहीत किए जाते हैं, क्योंकि आप उन्हें सीधे मेमोरी के माध्यम से एक्सेस नहीं कर सकते हैं , आपको हमेशा उनके लिए बैश पूछने की आवश्यकता है मूल्य, और बैश तो जो कुछ भी जिस तरह से यह करना चाहता है में उन्हें अनुवाद कर सकते हैं देखने के रूप में यदि वे था किसी भी विशिष्ट तरीके से संग्रहित किया गया।

वास्तव में, वे भी स्मृति में संग्रहीत नहीं किया जा सकता है । मुझे नहीं पता कि बाश के सामान्य कार्यान्वयन कितने चतुर हैं, लेकिन यह सरल मामलों में कम से कम संभव है कि यह निर्धारित किया जाए कि एक चर का उपयोग किया जाएगा और / या क्या इसे संशोधित किया जाएगा, और इसे पूरी तरह से अनुकूलित करें या इसे इनलाइन करें।


मुझे लगता है कि प्रश्न के बिंदु प्रतिनिधित्व के बजाय था स्थान
bu5hman

2
मेरा कहना यह है कि आप प्रतिनिधित्व को नहीं जान सकते , क्योंकि आप उसका निरीक्षण नहीं कर सकते। तो, यह अप्रासंगिक है और यह आपके बिना कभी भी बदल सकता है। बस यह बताना असंभव है कि बैश किस प्रतिनिधित्व का चयन कर सकता है। आप एक कार्यान्वयन के सोर्सकोड में तल्लीन कर सकते हैं और यह देख सकते हैं कि यह कौन सा प्रतिनिधित्व चुनता है, लेकिन यह अगले पैच रिलीज़ में कल प्रतिनिधित्व बदल सकता है और आपके लिए जानने का कोई रास्ता नहीं होगा।
जोर्ग डब्ल्यू मित्तग

Schroedingers चर? मैं आपसे बुनियादी तौर पर इस बात से सहमत हूं कि अंतर्निहित प्रतिनिधित्व अप्रासंगिक है (मेरा उत्तर देखें) लेकिन बैश का उपयोग करने में हम प्रभावी रूप से 'एक इंटरफ़ेस पर कोडिंग' कर रहे हैं और इंटरफ़ेस पर प्रतिनिधित्व कठोर है।
bu5hman

2
हां, लेकिन सवाल इंटरफ़ेस सीमा पर प्रतिनिधित्व के बारे में नहीं है, लेकिन विशेष रूप से इस बारे में है कि वे "मेमोरी में संग्रहीत" कैसे हैं। और उस प्रश्न के लिए, मैं जवाब दूंगा: हम नहीं, नहीं कर सकते, और पता नहीं होना चाहिए।
जोर्ग डब्ल्यू मित्तग

जो मेरे स्वयं के पोस्ट की अंतिम पंक्ति को परिभाषित करता है ..... जैसा कि मैंने कहा, हम सहमत हैं ...... और ओपी प्रतिनिधि और प्रश्न की प्रकृति को देखते हुए, मुझे लगता है कि उन्हें उनके होमवर्क के लिए उचित अंक दिए जाएंगे, जो भी उद्धृत हो जाता है ;-)।
bu5hman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.