শেল স্ক্রিপ্ট "যদি" বিবৃতিতে একটি ভেরিয়েবল উদ্ধৃত করুন


9

যেমন

if [ "$FOO" = "true" ]; then

বনাম

if [ $FOO = "true" ]; then

কি আলাদা? দুটি বিবৃতি উভয়ই কাজ করে বলে মনে হচ্ছে।



@ ডেনিস উইলিয়ামসন একেবারেই নয়, আপনার (ইন) সমতা এবং প্যাটার্ন ম্যাচিং অপারেটরগুলির ডানদিকে কোট প্রয়োজন need
গিলস 'অশুভ হওয়া বন্ধ করুন'


@ গিলস: কখনও কখনও না। বা আক্ষরিক স্ট্রিং বা ভেরিয়েবল যেটা ধারণ করে স্পেস ধারণকারী আক্ষরিক স্ট্রিং জন্য উল্লিখিত glob অক্ষর আছে যা আপনি আক্ষরিক গ্রহণ করা হবে চান , ডান পাশের উদ্ধৃত করতে হবে: a='foo bar'; [[ $a == "foo bar" ]]। যাইহোক, একটি পরিবর্তনশীল যা উল্লিখিত glob অক্ষর ধারণ করে না প্রয়োজন হবে না: [[ $a == $a ]]। শব্দ বিস্তৃতি ডাবল বর্গাকার বন্ধনীগুলির মধ্যে সঞ্চালিত হয় না। এবং রেজেক্সের মিলের জন্য, ডানদিকে থাকা প্যাটার্নটি উদ্ধৃত করা উচিত নয় বা এটি আক্ষরিক স্ট্রিং হিসাবে নেওয়া হবে: [[ $a =~ .*oo.*r ]](প্যাটার্নটি অবশ্য পরিবর্তে পরিবর্তিত পরিবর্তনশীল হওয়া উচিত ...
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে

আক্ষরিক হিসাবে এখানে অন্তর্ভুক্ত করা)। উল্লিখিত glob-শৈলী প্যাটার্ন ম্যাচিং জন্য, উল্লিখিত glob অক্ষর উদ্ধৃত আবশ্যক না, কিনা আক্ষরিক বা একটি পরিবর্তনশীল মধ্যে: [[ $a == foo* ]]। আপনি আমার আক্ষরিক স্ট্রিং উদাহরণ ছাড়াও উদ্ধৃতি প্রয়োজনের অতিরিক্ত কোনও উদাহরণ প্রদান করতে পারেন?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

উত্তর:


6

যদি মানটি $FOOকোনও একক শব্দের সাথে থাকে যেখানে কোনও ওয়াইল্ডকার্ডের অক্ষর থাকে না \[*?, তবে দুটি মিল অভিন্ন।

যদি $FOOনিযুক্ত না করা, বা খালি, বা একাধিক শব্দের (যেমন, $IFSশ্বেত স্পেস থাকে বা ) থাকে, তবে অব্যক্ত সংস্করণটি একটি সিনট্যাক্স ত্রুটি। যদি এটি শব্দের যথাযথ ক্রম (যেমন 0 -eq 0 -o false) হয় তবে ফলাফলটি স্বেচ্ছাচারিত হতে পারে। সুতরাং, শেল স্ক্রিপ্টগুলিতে সর্বদা ভেরিয়েবল উদ্ধৃত করা ভাল অনুশীলন।

ঘটনাচক্রে, "true"উদ্ধৃত করা প্রয়োজন হয় না।


3

এটি কী কী সমস্যা সৃষ্টি করতে পারে তা বোঝাতে এখানে কয়েকটি উদাহরণ।

ধরা যাক অনুসরণ হিসাবে আমাদের দুটি ভেরিয়েবল রয়েছে:

FOO="some value"
BAR="some value"

এখন আমাদের কাছে দুটি ভেরিয়েবল আছে ঠিক একই স্ট্রিং / মান ধারণ করে। ফলাফলটি পরীক্ষার জন্য যদি বিবৃতিগুলি আমরা কিছু করি তবে আপনার ক্ষেত্রে:

if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi

এই মুহুর্তে আপনি পাবেন bash: [: too many arguments। অনাবৃত $ এফইও-র এখন তিনটি মান রয়েছে '[ , some , value'[পরীক্ষার কীওয়ার্ডটি কার্যকর করতে জানে না কারণ এটি অপারেটর হওয়ার জন্য প্রথম বা দ্বিতীয় যুক্তির প্রত্যাশা করে।

যখন আমরা "$ এফইও" উদ্ধৃত করি তখন আমরা স্পষ্টভাবে ifসঠিক মানগুলি দেখতে বলি যেখানে কোনও শব্দ বিভাজন ঘটে না।

আরেকটি উদাহরণ:

my_file="A random file.txt"
  • করা rm $my_fileমানে 'এ' 'এলোমেলো' 'ফাইল.txt' অপসারণ যা এটি তিনটি ফাইল করে।
  • করার rm "$my_file"ফলে "একটি এলোমেলো file.txt" মুছে ফেলা হবে যা একটি ফাইল করে।

আশা করি আমি আপনাকে এই উদাহরণগুলির সাথে গুলিয়ে ফেলিনি।


0

এই নির্দিষ্ট ক্ষেত্রে কোনও পার্থক্য নেই।

তবে, যদি $FOOকোনও স্থান বা কিছু বিশেষ অক্ষর থাকে তবে আপনার সমস্যা হবে।

ইন "$FOO"কেস, এটা মোট ভেরিয়েবল ব্যবহার করবে ম্যাচ স্থান সমস্যা থেকে অন্তরক করা।

তবে, আপনি যদি ব্যবহার করেন $FOOএবং কোনও বিশেষ কেস থাকে তবে এটি যদি বিবৃতিটিকে প্রভাবিত করে।

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