eval
এটির সাথে কাজ করার একটি ভাল উপায় এটি echo
পরীক্ষার জন্য প্রতিস্থাপন করা । echo
এবং eval
একই কাজ করুন (যদি আমরা \x
কিছু echo
বাস্তবায়নের মতো bash
কিছু শর্তে এর সম্প্রসারণটি আলাদা করে রাখি )।
উভয় কমান্ডই তাদের যুক্তিতে এর মধ্যে একটি জায়গার সাথে যুক্ত হয়। পার্থক্যটি হ'ল ফলাফলটি শেল কোড হিসাবে মূল্যায়ন / ব্যাখ্যা করার সময় ফলাফলটি echo
প্রদর্শন করে ।eval
সুতরাং, শেল কোড দেখতে
eval $(echo $var_name=$var_value)
মূল্যায়ন করতে হবে, আপনি চালাতে পারেন:
$ echo $(echo $var_name=$var_value)
fruit=blue orange
এটি আপনি যা চান তা নয়, আপনি যা চান তা হ'ল:
fruit=$var_value
এছাড়াও, $(echo ...)
এখানে ব্যবহার করার অর্থ নেই doesn't
উপরের আউটপুট আউট করতে, আপনি চালাতে চাই:
$ echo "$var_name=\$var_value"
fruit=$var_value
সুতরাং, এটি ব্যাখ্যা করতে, এটি সহজ:
eval "$var_name=\$var_value"
নোট করুন এটি পৃথক অ্যারে উপাদান সেট করতেও ব্যবহার করা যেতে পারে:
var_name='myarray[23]'
var_value='something'
eval "$var_name=\$var_value"
অন্যরা যেমন বলেছে, আপনি যদি নিজের কোডটি bash
নির্দিষ্ট বলে যত্নবান না করেন তবে আপনি এটি ব্যবহার করতে পারেন declare
:
declare "$var_name=$var_value"
তবে মনে রাখবেন এর কিছু পার্শ্ব প্রতিক্রিয়া রয়েছে।
এটি ভেরিয়েবলের ব্যাপ্তিটি যেখানে কাজ করে সেখানে সীমাবদ্ধ করে So সুতরাং আপনি উদাহরণ হিসাবে এটি ব্যবহার করতে পারবেন না:
setvar() {
var_name=$1 var_value=$2
declare "$var_name=$var_value"
}
setvar foo bar
কারণ এটি একটি ঘোষণা করবে foo
ভেরিয়েবল স্থানীয় setvar
হিসাবে ঘোষিত হবে অকেজো হবে।
bash-4.2
গ্লোবাল ভেরিয়েবল ঘোষণার -g
জন্য একটি বিকল্প যুক্ত করা হয়েছে , তবে আমরা যা চাই তা নয় এটি যেহেতু আমাদের আহ্বানকারী যদি কলার একটি ফাংশন থাকে তবে তার বিপরীতে একটি বৈশ্বিক ভার সেট করত :declare
setvar
setvar() {
var_name=$1 var_value=$2
declare -g "$var_name=$var_value"
}
foo() {
local myvar
setvar myvar 'some value'
echo "1: $myvar"
}
foo
echo "2: $myvar"
যা আউটপুট হবে:
1:
2: some value
এছাড়াও, নোট করুন যখন declare
বলা হয় declare
(আসলে bash
কর্ন শেল থেকে ধারণা ধার করাtypeset
বিল্টিন ), যদি ভেরিয়েবলটি ইতিমধ্যে সেট করা declare
থাকে তবে কোনও নতুন ভেরিয়েবল ঘোষণা করে না এবং যেভাবে অ্যাসাইনমেন্টটি করা হয় তা ভেরিয়েবলের ধরণের উপর নির্ভর করে।
এই ক্ষেত্রে:
varname=foo
varvalue='([PATH=1000]=something)'
declare "$varname=$varvalue"
varname
পূর্বে স্কেলার , অ্যারে বা এসোসিয়েটিভ অ্যারে হিসাবে ঘোষিত হলে একটি আলাদা ফলাফল (এবং সম্ভাব্য দুষ্টু পার্শ্ব প্রতিক্রিয়া) তৈরি করবে ।
eval
সেভাবে ব্যবহার করা ভুল। আপনি$var_value
এটি পাস করার আগে সম্প্রসারণ করছেনeval
যার অর্থ এটি শেল কোড হিসাবে ব্যাখ্যা করা হবে! (উদাহরণস্বরূপ চেষ্টা করুনvar_value="';:(){ :|:&};:'"
)