শেল স্ক্রিপ্টে, আমি যদি একটি চলক যেমন সংজ্ঞায়িত করি তবে FOO=25
এটি হিসাবে $FOO$
এবং উল্লেখ করার মধ্যে কোনও পার্থক্য আছে ${FOO}$
?
শেল স্ক্রিপ্টে, আমি যদি একটি চলক যেমন সংজ্ঞায়িত করি তবে FOO=25
এটি হিসাবে $FOO$
এবং উল্লেখ করার মধ্যে কোনও পার্থক্য আছে ${FOO}$
?
উত্তর:
সবচেয়ে পরিস্থিতিতে উভয় $var
এবং ${var}
একই। (নোট করুন যে আপনাকে অবশ্যই $
শেষে ব্যবহার করা উচিত নয় !)
অবিচ্ছিন্ন স্ট্রিংয়ে আপনার যখন ভেরিয়েবল লাগানোর দরকার হয় তার একটি উদাহরণ যেখানে আপনার কোঁকড়া ধনুর্বন্ধনী প্রয়োজন are
উদাহরণ:
var=hel
echo ${var}lo
আউটপুট হবে hello
।
আপনার মূল প্রশ্নের উত্তর দেওয়ার জন্য, "প্যারামিটার সম্প্রসারণ"${foo}
বলা হয় । সুনির্দিষ্টভাবে বলতে গেলে, প্যারামিটারের প্রসারণটি নিজেই শুরু হয় , পসিক্স স্পেসিফিকেশন অনুসারে এগুলি আসলে alচ্ছিক , তবে ভেরিয়েবলের নামের প্রান্তটি নির্দেশ করতে কার্যকর হতে পারে:$
{ }
$ foo="bar"
$ echo $fooBaz ## fails, no variable named $fooBaz exists
$ echo ${foo}Baz ## works, $foo is expanded and the string Baz is appended
barBaz
মূলত, $foo
এবং ${foo}
অভিন্ন। উপরের মত মামলাগুলি ছাড়াও বা আপনি যখন স্ট্রিং ম্যানিপুলেশন করছেন , সেগুলি সম্পূর্ণ সমতুল্য।
তবে, আপনার এগুলির কোনও ব্যবহার করা উচিত নয়। থাম্বের নিয়মটি হ'ল, খুব অল্প ব্যতিক্রম ছাড়া আপনার সর্বদা ব্যবহার করা উচিত "$foo"
বা "${foo}"
কখনই $foo
বা উচিত নয় ${foo}
। স্প্লিট + গ্লোব অপারেটরটি চালিয়ে যাওয়া এড়াতে আপনার সর্বদা আপনার পরিবর্তনশীলগুলি উদ্ধৃত করা উচিত (এর পরে আরও)। আপনি অবশ্যই চান না $foo$
। ফাইনালটি $
অপ্রাসঙ্গিক:
$ foo="bar"
$ echo "$foo$"
bar$
সুতরাং, যখন অব্যক্ত ভেরিয়েবলগুলি কখনও কখনও ঠিক থাকে:
$ echo $foo
bar
এগুলি সাধারণত হয় না এবং এড়ানো উচিত:
$ if [ -n $foo ]; then echo empty; else echo "not empty"; fi ## fails
empty
$ if [ -n "$foo" ]; then echo empty; else echo "not empty"; fi ## works
not empty
মনে রাখবেন বন্ধনীগুলি এখানেও সহায়তা করে না:
$ if [ -n ${foo} ]; then echo empty; else echo "not empty"; fi ## fails
empty
$ if [ -n "${foo}" ]; then echo empty; else echo "not empty"; fi ## works
not empty
আপনি যখন ব্যবহার করেন $foo
বা ${foo}
, শেলটি হোয়াইটস্পেসে ভেরিয়েবলের মধ্যে সংরক্ষিত মানকে আলাদা করে (এটি অন্য কোনওটির সাথে IFS
ভেরিয়েবলটি সেট করে পরিবর্তন করা যেতে পারে) একটি তালিকায় পরিণত করে এবং তারপরে তালিকার প্রতিটি উপাদানকে গ্লোব প্যাটার্ন হিসাবে বিবেচনা করা হবে এবং এতে প্রসারিত হবে কোনও মিলে যাওয়া ফাইল বা ডিরেক্টরি। এটি স্প্লিট + গ্লোব অপারেটর হিসাবে পরিচিত । উদাহরণস্বরূপ, দুটি ফাইল সহ একটি ডিরেক্টরি বিবেচনা করুন:
$ ls -l
-rw-r--r-- 1 terdon terdon 0 Oct 9 18:16 file1
-rw-r--r-- 1 terdon terdon 0 Oct 9 18:16 file2
এখন, আসুন একটি ভেরিয়েবল সেট করুন foo *
:
$ foo="foo *"
যদি আমরা সেই নামের ফাইলটি উপস্থিত থাকে কিনা তা পরীক্ষা করে দেখার চেষ্টা করি তবে কী হবে?
$ if [ -e $foo ]; then echo "file exists"; else echo "no such file"; fi
file exists
ভেরিয়েবলটি বিভক্ত হয়েছিল foo
এবং *
যেহেতু *
কোনও ওয়াইল্ডকার্ড যা কোনও স্ট্রিংয়ের সাথে মেলে, শেল আপনাকে বলে যে একটি ফাইলকে foo *
এক্সজিস্ট বলে। তবে, আমরা যদি এটি সঠিকভাবে উদ্ধৃত করি তবে এটি ঘটে না:
$ if [ -e "$foo" ]; then echo "file exists"; else echo "no such file"; fi
no such file
বিষয়টি উল্লেখ করার জন্য এটি ছিল তুচ্ছ উদাহরণ। ভাবুন আমি যদি এর rm
পরিবর্তে ব্যবহার করে থাকি echo
।
সুতরাং, প্রথম নিয়ম: সর্বদা আপনার ভেরিয়েবলগুলি উদ্ধৃত করুন। আপনি হয় ব্যবহার করতে পারেন "$foo"
বা "${foo}"
তবে উভয় উপায়ে উদ্ধৃত করতে পারেন । নিরাপদে ভেরিয়েবলগুলি ব্যবহারের বিষয়ে আরও বিশদের জন্য এই পোস্টগুলিতে একবার দেখুন:
$ var="foo *"
হতে $ foo="foo *"
? আপনি var
কোথাও ব্যবহার করবেন না ।
$
শেষ অবধি ব্যবহার করবেন না! এটি ভ্যারিয়েবল নামের অংশ হিসাবে নয়, সাধারণ চরিত্র হিসাবে বিবেচিত হবে।