বাশ পয়েন্টার ব্যবহারের জন্য সমর্থন সরবরাহ করে?


12

সহজ প্রশ্ন. শেল স্ক্রিপ্ট লেখার সময় বাশ শেলের কি পয়েন্টার ব্যবহারের জন্য কোনও সমর্থন আছে?

${var[@]}অ্যারের $varমাধ্যমে পুনরুক্তি করার সময় আমি প্রসারণ নোটেশনের সাথে পরিচিত , তবে এটি স্পষ্ট নয় যে এটি অ্যারে সূচকগুলির উপরে পুনরাবৃত্তি করতে পয়েন্টারগুলি ব্যবহার করছে। বাশ কি অন্যান্য ভাষার মতো মেমরি ঠিকানাগুলিতে অ্যাক্সেস সরবরাহ করে?

যদি বাশ পয়েন্টার ব্যবহার করে সমর্থন না করে তবে অন্যান্য শেলগুলি কী করে?

উত্তর:


28

সিটির চেয়ে উচ্চ-স্তরের কোনও ক্ষেত্রে একটি পয়েন্টার ( মেমরির অবস্থানের জন্য ) আসলেই কার্যকর ধারণা নয়, এটি পাইথন বা শেলের মতো কিছু হোক। বস্তুর উল্লেখগুলি অবশ্যই উচ্চ-স্তরের ভাষাগুলিতে কার্যকর, সম্ভবত জটিল ডেটা স্ট্রাকচার তৈরির জন্যও প্রয়োজনীয় necessary তবে বেশিরভাগ ক্ষেত্রে মেমরির ঠিকানাগুলির ক্ষেত্রে চিন্তাভাবনা খুব নিম্ন স্তরের খুব কার্যকর।

বাশ (এবং অন্যান্য শেলস) এ, আপনি স্বরলিখনের সাথে অ্যারে উপাদানগুলির মানগুলি পেতে পারেন ${array[index]}, তাদের সাথে নিয়োগ করতে array[index]=...এবং অ্যারের সাথে উপাদানগুলির সংখ্যা পেতে পারেন ${#array[@]}। বন্ধনীগুলির ভিতরে প্রকাশটি একটি গাণিতিক প্রকাশ expression একটি অন্তর্নির্মিত উদাহরণ হিসাবে, আমরা সমস্ত অ্যারে সদস্যদের একটি ধ্রুবক উপসর্গ যোগ করতে পারে:

for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
    array[i]="foo-${array[i]}"
done

(আমরা যদি কেবল মূল্যবোধের যত্ন নিই, এবং সূচিগুলি নাও ঠিক রাখি for x in "${array[@]}" ; do...))

সঙ্গে মিশুক বা বিক্ষিপ্ত অ্যারে , একটি সংখ্যাসূচক লুপ অনেক অর্থে দেখা যায় না, কিন্তু এর পরিবর্তে আমরা অ্যারে কী / ইনডেক্স আনা প্রয়োজন চাই ${!array[@]}। যেমন

declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do 
    echo "${assoc[$i]}"
done 

এগুলি ছাড়াও, বাশের অপরূপভাবে অন্য ভেরিয়েবলের দিকে নির্দেশ করার দুটি উপায় রয়েছে:

  • পরোক্ষ সম্প্রসারণ ব্যবহার করে, বাক্য গঠন , যা পরিবর্তনশীল যার মান ব্যবহার নাম রয়েছে , এবং${!var}var
  • namerefs , সঙ্গে তৈরি করা প্রয়োজন যা declarebuiltin (অথবা ksh-compatible প্রতিশব্দ, typeset)। পরিবর্তনশীল একটি রেফারেন্স declare -n ref=varতোলে ।refvar

নেমরেফগুলি সূচকগুলিও সমর্থন করে, এতে যদি আমাদের থাকে arr=(a b c); declare -n ref=arr;তবে ${ref[1]}প্রসারিত হবে b। ব্যবহার ${!p[1]}পরিবর্তে লাগবে pএকটি অ্যারের, এবং তার দ্বিতীয় উপাদান নামে পরিবর্তনশীল পড়ুন।

বাশ-এ, নামরেফগুলি আক্ষরিক অর্থে যে নাম অনুসারে রেফারেন্স এবং কোনও ফাংশনের ভিতরে থেকে নেমরেফ ব্যবহার করলে নামযুক্ত ভেরিয়েবলের স্থানীয় মান ব্যবহৃত হবে। এটি মুদ্রণ করবে local value of var

#!/bin/bash
fun() {
        local var="local value of var"
        echo "$ref";
}
var="global var"
declare -n ref=var
fun

বাশফ্যাকএরও ইন্ডিয়ারেশন নিয়ে দীর্ঘতর নিবন্ধ রয়েছে


2
ইন্ডিরিয়েশন উচ্চ স্তরের ভাষাগুলিতে বেশ কার্যকর। যেমন পার্ল রেফারেন্স। এগুলি সি পয়েন্টারগুলির মতো নয় তবে তারা একই বেসিক ফাংশনটি সরবরাহ করে। এমনকি বাশও পরোক্ষভাবে ভেরিয়েবল অ্যাক্সেস করতে পারে ... তবে আইএমও আপনি যদি এমন কোড লেখা শুরু করেন যা বৈশিষ্ট্যের উল্লেখযোগ্য ব্যবহার করে তবে আপনি পার্ল বা কোনও কিছু দিয়ে স্ক্র্যাচ থেকে শুরু করে ভাল। আরও দেখুন mywiki.wooledge.org/BashFAQ/006
সি এ এস

2
@ ক্যাস, ওহ, একেবারে তবে এগুলি মেমরির ঠিকানাগুলির চেয়ে বরং বস্তুর দিকে নির্দেশক হিসাবে বিবেচনা করা আরও ভাল । (এমনকি সি-তেও এর মধ্যে একটি প্রকার জড়িত)
ইল্কাচ্চু

আপনার সম্ভবত for foo in "${array[@]}" ; do ... doneঅন্য উদ্দেশ্যে (গুলি) সূচকের প্রয়োজন না হলে ফোর-লুপের উদাহরণটি স্বাভাবিকভাবেই রচিত তা উল্লেখ করা উপযুক্ত।
উইল ক্র্যাফোর্ড

@ উইলক্রাফোর্ড, পয়েন্ট উদাহরণ সম্পাদনা করেছেন এবং উল্লেখ করেছেন।
ilkkachu

9

না, bash"পয়েন্টার" নেই, তবে এর উল্লেখ রয়েছে:

$ spam="fred"
$ declare -n tripe=spam
$ echo $tripe
fred
$ tripe=juki
$ echo $spam
juki

থেকে bashমানুষ পৃষ্ঠা:

একটি ভেরিয়েবলকে নামরেফ তৈরির জন্য বিল্টিন কমান্ডগুলিতে -n বিকল্প ব্যবহার করে declareঅথবা localঅন্য ভেরিয়েবলের রেফারেন্স ব্যবহার করে নামরেফ বৈশিষ্ট্য নির্ধারণ করা যেতে পারে । এটি ভেরিয়েবলকে অপ্রত্যক্ষভাবে হেরফের করতে দেয় allows যখনই নেমরেফ ভেরিয়েবলটি রেফারেন্স করা হয়, নির্ধারিত হয়, আনসেট করা হয়, বা এর বৈশিষ্ট্যগুলি পরিবর্তিত হয় (নাম নেফ বৈশিষ্ট্যটি নিজে ব্যবহার করা বা পরিবর্তন করা ছাড়াও) অপারেশনটি আসলে নামেরেফ ভেরিয়েবলের মান দ্বারা নির্দিষ্ট ভেরিয়েবলের উপর সঞ্চালিত হয়। একটি নেমরেফ শেল ফাংশনগুলির মধ্যে সাধারণত একটি ভেরিয়েবলের উল্লেখ করতে ব্যবহৃত হয় যার নামটি ফাংশনের আর্গুমেন্ট হিসাবে পাস করা হয়। উদাহরণস্বরূপ, যদি কোনও চলক নামটি শেল ফাংশনে তার প্রথম যুক্তি হিসাবে চালিত হয় তবে এটি চলছে

declare -n ref=$1

ফাংশনের অভ্যন্তরে একটি নেমরেফ ভেরিয়েবল রেফ তৈরি হয় যার মান হল প্রথম আর্গুমেন্ট হিসাবে ভেরিয়েবলের নাম passed রেফারেন্সের জন্য রেফারেন্স এবং অ্যাসাইনমেন্ট, এবং এর বৈশিষ্ট্যগুলিতে পরিবর্তনগুলি, উল্লেখযোগ্য হিসাবে বিবেচিত হয় যা ভেরিয়েবলের নাম $ 1 হিসাবে পাস হয়েছিল। যদি লুপের জন্য নিয়ন্ত্রণ ভেরিয়েবলের নামরেফ বৈশিষ্ট্য থাকে তবে শব্দের তালিকাটি শেল ভেরিয়েবলের একটি তালিকা হতে পারে এবং লুপটি কার্যকর হওয়ার পরে তালিকার প্রতিটি শব্দের জন্য একটি নামের রেফারেন্স স্থাপন করা হবে। অ্যারে ভেরিয়েবলগুলি নামের বৈশিষ্ট্য দেওয়া যাবে না। তবে নেমরেফ ভেরিয়েবলগুলি অ্যারে ভেরিয়েবল এবং সাবস্ক্রিপ্টড অ্যারে ভেরিয়েবলগুলি উল্লেখ করতে পারে। নেমরেফগুলি অন্তর্নির্মিত -n বিকল্প ব্যবহার করে আনসেট করা যেতে পারে unset। অন্যথায়, যদিunset আর্গুমেন্ট হিসাবে নেমরেফ ভেরিয়েবলের নামের সাথে মৃত্যুদন্ড কার্যকর করা হয়, নেমরেফ ভেরিয়েবল দ্বারা উল্লেখ করা ভেরিয়েবলটি সেট না করে সেট করা হবে।


4

না, শেলগুলি "পয়েন্টার" ব্যবহার করে না (যেমন সি তে বোঝা গেছে)।

অ্যারে সূচকগুলি ব্যবহার করতে পারে: echo "${array[2]}"তবে @আপনার উদাহরণটিতে আসলে "পয়েন্টার" নয়। এটি "অ্যারের মানগুলির তালিকা" প্রকাশ করার একটি উপায়। শেল পার্সার বুঝতে পারে এমন কিছু। যেভাবে একটি:

$ echo "$@"

সমস্ত "অবস্থানগত পরামিতি" তালিকায় প্রসারিত হয়।


2

যদিও ব্যাশ ইন্টিজার ইনডেক্সেড অ্যারেগুলি সংজ্ঞায়িত করা যায় এবং এর মতো পুনরাবৃত্তভাবে অ্যাক্সেস করা যায়;

declare -a obj
obj+=("val1")
obj+=("val2")

for item in ${obj[@]}; do
  echo "${obj[${item}]} ${item}"
done

ব্যাশে সহযোগী বা স্ট্রিং ভিত্তিক সূচকযুক্ত অ্যারেগুলির জন্য নিম্নলিখিত পুনরাবৃত্ত সংজ্ঞাটি প্রয়োজন;

declare -A obj
obj["key1"]="val1"
obj["key2"]="val2"

for item in ${!obj[@]}; do
  echo "${obj[${item}]} ${item}"
done

পয়েন্টার সম্পর্কিত এবং ব্যাশ থেকে একটি ব্যবহার সম্পর্কিত প্রশ্নের উত্তর দিতে; সংকলিত ব্যাশ বাইনারি অভ্যন্তরীণ কার্যকারিতা প্রকৃতপক্ষে স্ট্যাক বরাদ্দ মেমরি পয়েন্টার ব্যবহার করে না এবং ব্যবহারের সাথে অনুরূপ কার্যকারিতা প্রকাশ করে eval। [পরোক্ষ রেফারেন্স] দেখুন http://tldp.org/LDP/abs/html/ivr.html )

ড্রাগন আছে; evalসুরক্ষা জড়িত কারণে ব্যবহার সতর্কতার সাথে ব্যবহার করা উচিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.