গ্রিপ-এ একক-উদ্ধৃতি, ডাবল-উদ্ধৃতি কখন ব্যবহার করবেন?


20

কোনও ফাইলে একটি সাধারণ প্যাটার্ন "হ্যালো" সন্ধানের চেষ্টা করার সময়, নিম্নলিখিত সমস্ত ধরণের গ্রেপ কাজ করে:

  • গ্রেপ হ্যালো ফাইল 1
  • গ্রেপ 'হ্যালো' ফাইল 1
  • গ্রেপ "হ্যালো" ফাইল 1

এখানে কি একটি নির্দিষ্ট কেস রয়েছে যেখানে উপরের ফর্মগুলির মধ্যে একটি কাজ করে তবে অন্যরা তা করে না। আমি যদি অন্যটির স্থানে একটি ব্যবহার করি তবে তাতে কী কোনও পার্থক্য রয়েছে?

উত্তর:


25

এটি আসলে আপনার শেলের উপর নির্ভরশীল। উদ্ধৃতি (উভয় ধরণের) মূলত হোয়াইটস্পেসের সাথে কাজ করার জন্য বোঝানো হয়। উদাহরণস্বরূপ, নিম্নলিখিত:

grep hello world file1

"ওয়ার্ল্ড" এবং "ফাইল 1" নামের ফাইলগুলিতে "হ্যালো" শব্দটির সন্ধান করবে, যখন

grep "hello world" file1

ফাইল 1 এ "হ্যালো ওয়ার্ল্ড" সন্ধান করবে।

একক বা ডাবল উদ্ধৃতিগুলির মধ্যে পছন্দগুলি কেবলমাত্র তখনই গুরুত্বপূর্ণ যদি অনুসন্ধানের স্ট্রিংয়ে ভেরিয়েবল বা অন্যান্য আইটেম থাকে যা আপনি মূল্যায়নের প্রত্যাশা করেন। একক উদ্ধৃতি সহ, স্ট্রিংটি আক্ষরিকভাবে নেওয়া হয় এবং কোনও প্রসারণ হয় না। ডাবল উদ্ধৃতি সহ, ভেরিয়েবলগুলি প্রসারিত হয়। উদাহরণস্বরূপ (বাশ বা জেডএসএইচের মতো বোর্ন-উত্পন্ন শেল সহ):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

প্রথমটি grepফাইল 1-এ আক্ষরিক স্ট্রিং "$ VAR1" সন্ধান করবে। দ্বিতীয়টি "$ VAR" ভেরিয়েবল প্রসারিত করবে এবং ফাইল 1-এ স্ট্রিং "সার্ভারফল্ট" সন্ধান করবে।


মূল বিষয়টি লক্ষ্য করার বিষয়টি হ'ল মূল প্রশ্নে গ্রেপ প্রকৃতপক্ষে প্রতিবার একই একই যুক্তি গ্রহণ করে।
মাইকিবি

2
সেখানে সাবধানতা অবলম্বন করুন। $একটি নিয়মিত প্রকাশের মধ্যে শেষের-লাইন, তাই $VAR1কখনই আসলে কোনও কিছুর সাথে মেলে না। এটি জিএনইউ গ্রেপ-এ কাজ করার ঘটনা ঘটে, তবে আমি এখনও সেই আচরণের উপর নির্ভর করি না। \$VAR1আক্ষরিক স্ট্রিংয়ের সুরক্ষার সাথে আপনার সুরক্ষার দরকার আছে। (এবং যদি আপনার ডাবল উদ্ধৃতিতে থাকে তবে আপনাকে অতিরিক্ত ব্যাকস্ল্যাশগুলির প্রয়োজন হবে))
স্টিভেন প্রিচার্ড

7

জেমস সঠিক, তবে আরও কিছু তথ্য যুক্ত করার জন্য, আমি মনে করি যে এটি সম্পর্কে চিন্তা করার সর্বোত্তম উপায় হ'ল আদেশের যুক্তি হিসাবে: আপনি কি "হ্যালো" এবং "ওয়ার্ল্ড" কে দুটি যুক্তি বা "হ্যালো ওয়ার্ল্ড" হতে চান? যুক্তি.

এছাড়াও, ডাবলকোটগুলি কেবলমাত্র ভেরিয়েবলের চেয়ে বেশি ব্যাখ্যার অনুমতি দেয়। আপনার শেলের উপর নির্ভর করে ঠিক কী, তবে ইতিহাসের সম্প্রসারণ, ব্রেস প্রসারণ এবং ফাইলের নাম প্রসারণ পরীক্ষা করে দেখুন।

এটি লক্ষণীয়ও গুরুত্বপূর্ণ যে এমন কয়েকটি দৃষ্টান্ত রয়েছে যেখানে আপনাকে একটি যুক্তিতে উভয় প্রকারের উদ্ধৃতি ব্যবহার করতে হবে। মনে রাখবেন (ডিফল্টরূপে) আর্গুমেন্টগুলি হোয়াইট স্পেস দ্বারা সীমিত করা হয়, তাই আপনি যদি কোনও স্থান ছেড়ে না যান তবে আপনি এখনও একই যুক্তিটি নির্দিষ্ট করছেন।

বেশিরভাগ শেলের সিঙ্গলকোট মেকানিজম কোনও বিশেষ অক্ষরের জন্য মঞ্জুরি দেয় না, যার অর্থ অন্য কোনও সিঙ্গেলকোটের কোনও উদাহরণ, এমনকি যদি এটি পালিয়ে যায় বলে মনে হয়, উদ্ধৃতিটি শেষ করে। একক এককৃত স্ট্রিংয়ের অভ্যন্তরে এককোটের সাথে একটি স্ট্রিং পাস করা অসম্ভব এবং আপনাকে ডাবলকোটগুলি ব্যবহার করতে হবে। এটি এমন ব্যথা হতে পারে যখন আপনি একটি যুক্তিটি পাস করতে চান যার মধ্যে সিঙ্গলকোটস এবং এমন কিছু রয়েছে যার অর্থ ব্যাখ্যা করা যেতে পারে তবে আপনি হতে চান না। উদাহরণস্বরূপ, আপনি যদি আক্ষরিক স্ট্রিং "` '$ VAR' একটি পরিবর্তনশীল "পাস করতে চান তবে আপনাকে এটি এইভাবে করতে হবে:

"'"'$VAR'"' is a variable"

এটি আসলে তিনটি উদ্ধৃতি-পলায়নের স্ট্রিংয়ের সংক্ষেপণ:

"'"
'$VAR'
"' is a variable"

বা, উদ্ধৃতিগুলি সরানো সহ:

'
$VAR
' is a variable

আসলে, বেশিরভাগ শাঁস সহ, আপনি এটিও এইভাবে করতে পারেন:

"'\$VAR' is a variable"

যেখানে ব্যাকস্ল্যাশ (" \") শেলটিকে নিম্নলিখিত অক্ষরটি আক্ষরিকভাবে গ্রহণ করতে বলে এবং এতে কোনও প্রসারণ না করে।

তবে কিছু উদাহরণ রয়েছে যেখানে আপনি এটি মাল্টি-স্ট্রিং-কনটেনটেশন উপায়ে করতে শেষ করেছেন, তা নয় যে আমি এখনই একটি উদাহরণ নিয়ে আসতে পারি।

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