শেল স্ক্রিপ্টের সাহায্যে কোনও ভেরিয়েবলের সামগ্রীর সামগ্রীর মুদ্রণ কি সম্ভব? (পরোক্ষ রেফারেন্সিং)


13

ধরা যাক আমি নিম্নলিখিত ভেরিয়েবলগুলি ঘোষণা করেছি:

$ var='$test'
$ test="my string"

আমি যদি সেগুলির বিষয়বস্তু মুদ্রণ করি তবে আমি নিম্নলিখিতটি দেখতে পাচ্ছি:

$ echo $var
$test

$ echo $test
my string

আমি $var(যে বিষয়বস্তু এর বিষয়বস্তু $test) এর লিখিত সামগ্রী মুদ্রণের একটি উপায় খুঁজে পেতে চাই । সুতরাং আমি নিম্নলিখিতটি করার চেষ্টা করেছি:

$ echo $(echo $var)
$test

তবে এখানে ফলাফলটি এসেছে $testএবং তা নয় "my string"... বাশ ব্যবহার করে ভেরিয়েবলের সামগ্রীর সামগ্রীর মুদ্রণ কি সম্ভব?


আপনি কোন শেলটি ব্যবহার করছেন বা আপনার কাছে কোন বহনযোগ্যতার প্রয়োজনীয়তা রয়েছে তা বলতে আপনি নিজের পোস্টটি সম্পাদনা করতে পারেন?
মাইকেল হোমার

@ মিশেলহোমর শিওর, তবে আমি কীভাবে এই তথ্যটি পরীক্ষা করতে পারি?
রাফায়েল মুয়েনস্ক

এটি যাচাই করার চেয়ে কিছু বেশি যা আপনি পছন্দ করেন। উদাহরণস্বরূপ, আপনি কি আপনার স্ক্রিপ্টগুলি ash, বা bash, বা csh, বা dash, ..., বা zsh, বা পসিক্স দিয়ে চালাচ্ছেন sh, বা আপনার বিভিন্ন সিস্টেমে কাজ করার দরকার আছে?
মাইকেল হোমার

@ মিশেলহোমর আহ, আমি দেখছি ... আমি ব্যাশ ব্যবহার করছি আমি কেবল চূড়ান্ত প্রশ্নটি পরিবর্তন করব এবং তারপরে একটি নতুন ট্যাগ সন্নিবেশ করবো।
রাফায়েল মায়নারস্ক

উত্তর:


21

আপনি বাশের পরোক্ষ চলক প্রসারণটি ব্যবহার করে এটি সম্পাদন করতে পারেন (যতক্ষণ না $আপনার রেফারেন্স ভেরিয়েবলটি বাদ দেওয়া আপনার পক্ষে ঠিক আছে ):

$ var=test
$ test="my string"
$ echo "$var"
test
$ echo "${!var}"
my string

3.5.3 শেল প্যারামিটার সম্প্রসারণ


10

কেসটির জন্য যখন অন্তর্ভুক্ত ভেরিয়েবলের নামটি আপনার varসাথে $ব্যবহার করতে পারে eval:

$ var='$test'
$ test="my string"
$ eval echo $var
my string

আপনি কি আমার সাথে কি করতে চান:

  • বাশ $varমান প্রসারিত $testকরে একটি eval echo $testকমান্ড তৈরি করে;
  • evalecho $testএক্সপ্রেশন মূল্যায়ন এবং একটি পছন্দসই ফলাফল উত্পাদন করে।

দ্রষ্টব্য, evalসাধারণভাবে ব্যবহার করা বিপজ্জনক হতে পারে (যা সঞ্চিত রয়েছে তার উপর নির্ভর করে var), তাই এড়ানো এড়াতে পছন্দ করুন। অপ্রত্যক্ষ সম্প্রসারণ বৈশিষ্ট্যটি আপনার ক্ষেত্রে ভাল (তবে আপনাকে $সাইন ইন থেকে মুক্তি দিতে হবে $test)।


অবশ্যই, এটি একটি ভুল টাইপ। মূল পোস্টে একক উদ্ধৃতি রয়েছে। সংশোধন করা হয়েছে।
ডানিলা কিভার

4
আমি সর্বদা ডাবল-উদ্ধৃতি ভেরিয়েবল উল্লেখগুলি (অপ্রত্যাশিত শব্দ বিভাজন এবং ওয়াইল্ডকার্ড সম্প্রসারণ থেকে ঝামেলা এড়াতে) প্রস্তাব দিই। সঙ্গে eval, আপনি ডাবল কোট দুটি স্তরের প্রয়োজন, এই লাইন: eval echo "\"$var\""। মনে মনে, evalআপনি উল্লিখিত যে ব্যবহারের অন্যান্য বিপদ সম্পর্কে এটি কিছুই করে না ।
গর্ডন ডেভিসন

9

অনুরূপ Jesse_b এর উত্তর কিন্তু পরিবর্তনশীল অপ্রত্যক্ষ্যতার পরিবর্তে একটি নাম রেফারেন্স পরিবর্তনশীল ব্যবহার (প্রয়োজন bash4.3+):

$ declare -n var=test
$ test="my string"
$ echo "$var"
my string

নামের রেফারেন্স ভেরিয়েবল varতার চলকটির নাম উল্লেখ করে। যখন ভেরিয়েবলটি হিসাবে চিহ্নিত হয় $var, অন্য ভেরিয়েবলের মান ফিরে আসে।

bash নাম উল্লেখগুলি পুনরাবৃত্তভাবে সমাধান করে:

$ declare -n var1=var2
$ declare -n var2=test
$ test="hello world"
$ echo "$var1"
hello world

সম্পূর্ণতার জন্য, এসোসিয়েটিভ অ্যারে ( bash4.0+ এ) ব্যবহার করাও প্রয়োজনীয়তার উপর নির্ভর করে এটি সমাধানের একটি উপায়:

$ declare -A strings
$ strings[test]="my string"
$ var=test
$ echo "${strings[$var]}"
my string

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


3

সহ zsh:

$ var='$test'
$ test='*'
$ printf '%s\n' ${(e)var}
*

বোর্নের মতো শেল সহ

$ eval 'printf "%s\n" "'"$var"'"'
*

মনে রাখবেন যে এই শেলগুলিতে স্প্লিট + গ্লোব ( zshএকটি ব্যতিক্রম হওয়া) রোধ করতে পরিবর্তনশীল বিস্তৃতি অবশ্যই উদ্ধৃত করতে echoহবে এবং যথেচ্ছ ডেটার জন্য ব্যবহার করা যায় না।

যেহেতু উভয়ের সাথে (e)এবং evalশেল কোড মূল্যায়ন রয়েছে তাই এটি $varআপনার নিয়ন্ত্রণের মধ্যে থাকা বিষয়বস্তু হিসাবে গুরুত্বপূর্ণ অন্যথায় এটি একটি স্বেচ্ছাসেবক কমান্ড ইঞ্জেকশন দুর্বলতা ( ${!var}পদ্ধতির সাথে একই ) হতে পারে।

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