সমস্ত পরিবর্তনশীল বাশ মধ্যে স্ট্রিং হিসাবে মেমরি সংরক্ষণ করা হয়?


14

বলুন যে আমি নিম্নলিখিত ভেরিয়েবলগুলি তৈরি করেছি:

s=John
i=12345
f=3.14

এই সমস্ত ভেরিয়েবলগুলি স্ট্রিং হিসাবে মেমোরিতে সঞ্চয় করা আছে বা bashঅন্য ডেটা ধরণের রয়েছে?


1
শুধু আগ্রহের বাইরে কেন ব্যাপার হবে? যতক্ষণ না এটি ভাষার কার্যকারিতা প্রভাবিত করে না ততক্ষণ যদি সেগুলি সোয়াহিলি পাঠ্য হিসাবে সঞ্চিত থাকে তবে আমি সত্যিই কম যত্ন নিতে পারি না (পারফরম্যান্সকে প্রভাবিত করা একটি সমস্যা হতে পারে তবে, যদি এটি গুরুত্বপূর্ণ হয় তবে সেগুলি আপনার অস্ত্রাগারের চেয়ে ভাল সরঞ্জাম) bash)।

2
@ প্যাক্সিয়াব্লো কোনও ব্যাপার নয়, আমি কেবল কৌতূহল থেকে জিজ্ঞাসা করছি, যেহেতু আমি জানি অন্যান্য সমস্ত প্রোগ্রামিং / স্ক্রিপ্টিং ভাষা (উদাহরণস্বরূপ: জাভা, সি ++, জাভাস্ক্রিপ্ট, পিএইচপি, ইত্যাদি) প্রতিটি ডাটা টাইপের জন্য একটি অনন্য মেমরির উপস্থাপনা রয়েছে , সুতরাং স্ক্রিপ্টিং ভাষাটি দেখতে আকর্ষণীয় যেগুলির মধ্যে সমস্ত ডেটা ধরণের জন্য কেবল একটি মেমরির উপস্থাপনা থাকে।
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

বাশের মূলত সরল স্কেলার ভেরিয়েবল, অ্যারে এবং এসোসিয়েটিভ অ্যারে রয়েছে। এছাড়াও, স্কেলারগুলি declareবিল্টিনের সাথে পূর্ণসংখ্যা হিসাবে ট্যাগ করা যেতে পারে । স্ক্রিপ্ট প্রোগ্রামার / শেল ব্যবহারকারীর দৃষ্টিকোণ থেকে, স্ট্রিং ভেরিয়েবলগুলি স্ট্রিং হিসাবে কাজ করে, পূর্ণসংখ্যার ভেরিয়েবলগুলি পূর্ণসংখ্যা হিসাবে কাজ করে এবং তাদের প্রকার অনুসারে অ্যারে করে। অভ্যন্তরীণ বাস্তবায়ন খুব প্রাসঙ্গিক নয়।


তবে, আমরা যদি তথ্যটি মেমরিতে আসলে কীভাবে সঞ্চয় করতে চাই তা জানতে চাইলে প্রোগ্রামটি আসলে কী করে তা দেখতে আমাদের উত্স কোডটি পরীক্ষা করতে হবে।

4.4 বাশে, স্কেলারগুলি পূর্ণসংখ্যা ট্যাগ নির্বিশেষে স্ট্রিং হিসাবে সংরক্ষণ করা হয়। এই দৃশ্যমান সংজ্ঞা struct variable/ SHELL_VARহয় typedef এবং ফাংশনmake_variable_value , যা স্পষ্টভাবে সঞ্চয়ের জন্য স্ট্রিং পূর্ণসংখ্যার অনুবাদ।

লিঙ্কযুক্ত তালিকা ( 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
আমার বক্তব্যটি আপনি প্রতিনিধিত্ব জানতে পারবেন না , কারণ আপনি এটি পর্যবেক্ষণ করতে পারবেন না। সুতরাং, এটি অপ্রাসঙ্গিক এবং এটি আপনার কখনও বিবেচনা না করে পরিবর্তন হতে পারে। বাশ কী উপস্থাপনা চয়ন করতে পারে তা বলা কেবল অসম্ভব। আপনি কোনও প্রয়োগের উত্সকোডে সন্ধান করতে পারেন এবং এটি কী উপস্থাপনাটি চয়ন করে তা পরীক্ষা করতে পারেন তবে এটি আগামী প্যাচ রিলিজে উপস্থাপনাটি পরিবর্তন করতে পারে এবং আপনার জানার উপায় নেই।
জার্গ ডব্লু মিত্তাগ

শ্রোয়েডিংগার ভেরিয়েবল? অন্তর্নিহিত প্রতিনিধিত্ব অপ্রাসঙ্গিক হওয়ার বিষয়ে আমি আপনার সাথে মৌলিকভাবে সম্মত হই (আমার উত্তর দেখুন) তবে ব্যাশ ব্যবহারের ক্ষেত্রে আমরা কার্যকরভাবে 'একটি ইন্টারফেসে কোডিং' করছি এবং ইন্টারফেসে প্রতিনিধিত্বটি কঠোর।
বু5hman

2
হ্যাঁ, তবে প্রশ্নটি ইন্টারফেসের সীমানায় উপস্থাপনের বিষয়ে নয়, বিশেষত তারা কীভাবে "স্মৃতিতে সঞ্চিত" রয়েছে সে সম্পর্কে। এবং সেই প্রশ্নের জবাব আমি দেব: আমরা জানি না, পারি না এবং জানা উচিত নয়।
জার্গ ডব্লু মিত্তাগ

কোনটি আমার নিজের পোস্টের শেষ লাইনটির প্যারাফ্রেস করে ..... যেমন আমি বলেছিলাম, আমরা সম্মত ...... এবং ওপিএসের প্রতিনিধি এবং প্রশ্নের প্রকৃতি দিয়েছি, আমি মনে করি তাদের গৃহকর্মের জন্য তাদের যুক্তিসঙ্গত চিহ্ন দেওয়া হবে, যে কেউ ;-) উদ্ধৃত হয়।
বু5hman
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.