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জন্য একটি বিকল্প যুক্ত করা হয়েছে , তবে আমরা যা চাই তা নয় এটি যেহেতু আমাদের আহ্বানকারী যদি কলার একটি ফাংশন থাকে তবে তার বিপরীতে একটি বৈশ্বিক ভার সেট করত :declaresetvar
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="';:(){ :|:&};:'")