শেল স্ক্রিপ্টে ভেরিয়েবল উল্লেখ করা


10

শেল স্ক্রিপ্টে, আমি যদি একটি চলক যেমন সংজ্ঞায়িত করি তবে FOO=25এটি হিসাবে $FOO$এবং উল্লেখ করার মধ্যে কোনও পার্থক্য আছে ${FOO}$?


2
আপনি অবশ্যই $শেষ অবধি ব্যবহার করবেন না! এটি ভ্যারিয়েবল নামের অংশ হিসাবে নয়, সাধারণ চরিত্র হিসাবে বিবেচিত হবে।
বাইট কমান্ডার

উত্তর:


16

সবচেয়ে পরিস্থিতিতে উভয় $varএবং ${var}একই। (নোট করুন যে আপনাকে অবশ্যই $শেষে ব্যবহার করা উচিত নয় !)

অবিচ্ছিন্ন স্ট্রিংয়ে আপনার যখন ভেরিয়েবল লাগানোর দরকার হয় তার একটি উদাহরণ যেখানে আপনার কোঁকড়া ধনুর্বন্ধনী প্রয়োজন are

উদাহরণ:

var=hel
echo ${var}lo

আউটপুট হবে hello


11

আপনার মূল প্রশ্নের উত্তর দেওয়ার জন্য, "প্যারামিটার সম্প্রসারণ"${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কোথাও ব্যবহার করবেন না ।
জো

@ জো ওহ, ভাল দুঃখ! হ্যাঁ, অবশ্যই এটি অবশ্যই দেখানোর জন্য ধন্যবাদ। উপায় দ্বারা কোনও সম্পাদনার পরামর্শ দিয়ে এই জাতীয় ভুলগুলি নির্ধারণ করতে দ্বিধা বোধ করবেন। এই ধরণের জিনিসটি খুব উত্সাহিত হয়, অবিকল এটির মতো নির্বোধ ত্রুটিগুলি এড়াতে।
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.