"…", '...', $ '…', এবং $ "…" উদ্ধৃতিগুলির মধ্যে পার্থক্য কী?


49

মাঝে মাঝে আমি স্ক্রিপ্ট কিছু টেক্সট মূল্য উদ্ধৃতি এই বিভিন্ন উপায়ে সব ব্যবহার দেখুন: "...", '...', $'...', এবং $"..."। কেন এখানে বিভিন্ন ধরণের উদ্ধৃতি ব্যবহার করা হচ্ছে?

তারা কি অন্যরকম আচরণ করে বা তাদের ভিতরে আমি কী করতে পারি তা প্রভাবিত করে?


1
সম্ভাব্য ক্রস-সাইট সদৃশ। এই উত্তরটি বিভিন্ন ধরণের উদ্ধৃতিগুলির শব্দার্থকগুলির সংক্ষিপ্তসার (বা লিঙ্কগুলি) সরবরাহ করে।
চিপনার

উত্তর:


66

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

সংক্ষেপে:

  • '...' সম্পূর্ণ আক্ষরিক।
  • "..." উভয় ভেরিয়েবল এবং এম্বেড করা উদ্ধৃতি অক্ষরকে অনুমতি দেয়।
  • $'...'চরিত্রের মতো পালিয়ে যায় \nতবে ভেরিয়েবলগুলি প্রসারিত করে না।
  • $"..." বাশ এবং ksh ভাষায় মানব-ভাষা অনুবাদগুলির জন্য।

'একক উদ্ধৃতি'

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

এই সমস্ত উদাহরণের ফলে ফলাফলের মধ্যে কী লেখা হয়েছিল আক্ষরিকভাবে:

'hello world'                     => hello world
'/pkg/bin:$PATH'                  => /pkg/bin:$PATH
'hello\nworld'                    => hello\nworld
'`echo abc`'                      => `echo abc`
'I\'dn\'t've'                     => I\dn'tve

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

আক্ষরিক পাঠ্য এবং ভেরিয়েবলগুলির সংমিশ্রণের জন্য কিছুটা প্রচলিত প্রবাদ হ'ল এগুলি একসাথে চালানো:

'let x="'$PATH\"

ফলাফল হবে

let x="/usr/bin:/bin"

একটি একক শব্দ হিসাবে ( $PATHকেবলমাত্র ক্ষেত্রে ডাবল-কোট করা ভাল - ভেরিয়েবলের মানে ফাঁকা বা গ্লোব্বিং অক্ষরগুলি অন্যথায় প্রক্রিয়াজাত করা যেতে পারে - তবে পঠনযোগ্য চলমান উদাহরণের জন্য আমি পাইনি)।


"উদ্ধৃতি চিহ্ন"

ডাবল কোটের ভিতরে, দুই প্রকারের প্রসেস প্রক্রিয়া করা হয়, এবং প্রসারণ বা প্রসেস হওয়া থেকে রক্ষা পেতে আপনি অক্ষরগুলি থেকে বাঁচতে ব্যাকস্ল্যাশ ব্যবহার করতে পারেন।

ডাবল উদ্ধৃতিগুলির মধ্যে দুটি ধরণের সম্প্রসারণ ঘটে:

উদ্ধৃতিগুলির অভ্যন্তরে, একটি ব্যাকস্ল্যাশ $বা এর আগে রেখে এই বিস্তৃতিগুলিকে বাধা দিতে পারে `। এটি একটি শেষ ডাবল উদ্ধৃতি থেকেও রক্ষা পেতে পারে, সুতরাং \"এটি কেবল "আপনার স্ট্রিং বা অন্য কোনও ব্যাকস্ল্যাশের অন্তর্ভুক্ত। অন্য কোনও ব্যাকস্ল্যাশ আক্ষরিকভাবে সংরক্ষণ করা হয় - অন্যান্য অক্ষর তৈরি করতে কোনও পালাতে পারে না, এবং এটি সরানো হয় না।

এর মধ্যে কয়েকটি উদাহরণ আগের চেয়ে আলাদাভাবে আচরণ করে, এবং কিছু কিছু তা করে না:

"hello world"                     => hello world
"/pkg/bin:$PATH"                  => /pkg/bin:/bin:/usr/bin
"hello\nworld"                    => hello\nworld
"hello\\nworld"                   => hello\nworld
"`echo abc`"                      => abc
"I\'dn\'t've"                     => I\'dn\'t've
"I'dn't've"                       => I'dn't've
"I\"dn\"t've"                     => I"dn"t've

AN 'এএনএসআই-সি উদ্ধৃতি'

মূল্য উদ্ধৃতি এই ধরনের সি-শৈলী ব্যাকস্ল্যাশ প্রক্রিয়া হওয়ার পালাতে পারবেন, কিন্তু না এমবেডেড ভেরিয়েবল বা বদল। এটি একমাত্র প্রকারের উদ্ধৃতি যা চরিত্রের পালাতে সহায়তা করে

এটি কেএসএইচ থেকে একটি এক্সটেনশন, এখন বাশ, জেডএস এবং অন্যান্য কয়েকটি শেলগুলিতে সমর্থিত। এটি এখনও পসিক্স স্ট্যান্ডার্ডের অংশ নয় এবং সর্বাধিক-বহনযোগ্য স্ক্রিপ্টগুলি এটি ব্যবহার করতে পারে না, তবে একটি বাশ বা ksh স্ক্রিপ্টটি বিনামূল্যে।

: এই বেরিয়ে সব তাদের সি অর্থ ব্যবহার করা যেতে পারে \a, \b, \f, \n, \r, \t, \v, এবং আক্ষরিক বেরিয়ে \\, \', \", এবং \?। এগুলি এক্সটেনশানগুলি \e(পালানোর চরিত্র) এবং বাশ এবং কেএসএসে \cx( সিটিআরএল -এক্স দ্বারা প্রবেশ করা হবে যেমন \cM, গাড়ীর ফিরে আসা) সমর্থন করে। শেলগুলির নিজস্ব কিছু ছোট ছোট এক্সটেনশান রয়েছে।

এটি চার ধরণের জেনেরিক চরিত্রকে পালানোর অনুমতি দেয়:

  • \nnn, অষ্টাল মান nnn সহ একটি একক বাইট
  • \xHH, হেক্সাডেসিমাল মান এইচএইচ সহ একটি একক বাইট
  • \uHHHH, ইউনিকোড কোডপয়েন্ট যার হেক্সাডেসিমাল সূচকটি এইচএইচএইচএইচ
  • \UHHHHHHHH, ইউনিকোড কোডপয়েন্ট যার হেক্সাডেসিমাল সূচকটি এইচএইচএইচএইচএইচএইচএইচএইচ

এই সমস্ত অঙ্কগুলি প্রথমটির পরে afterচ্ছিক।

$এবং এর `কোনও অর্থ নেই এবং আক্ষরিক অর্থে সংরক্ষণ করা হয়, তাই আপনি সেখানে কোনও পরিবর্তনশীল অন্তর্ভুক্ত করতে পারবেন না।

$'hello world'                    => hello world
$'/pkg/bin:$PATH'                 => /pkg/bin:$PATH
$'hello\nworld'                   => hello
                                     world
$'`echo abc`'                     => `echo abc`
$'I\'dn\'t\'ve'                   => I'dn't've
$'\U1f574\u263A'                  => 🕴☺

এই বেরিয়ে অধিকাংশই আপনি ব্যবহার সিমুলেট করতে কমান্ড , যদিও POSIX শুধুমাত্র প্রয়োজন , , , , , , , , এবং সেখানে কাজ করতে। আপনি একটি এম্বেড করার কমান্ড প্রতিকল্পন ব্যবহার করতে পারেন ভিতরে উদ্ধৃতি চিহ্ন প্রয়োজন হলে: ।printf\\\a\b\f\n\r\t\v\nnnprintf"Path:$(printf '\t')$PATH"


"স্থানীয় অনুবাদ"

এটি প্রাকৃতিক ভাষার পাঠ্যগত স্ট্রিংগুলির স্থানীয়করণের জন্য কেএসএইচ এবং বাশ-নির্দিষ্ট এক্সটেনশন এবং বার্তা ক্যাটালগের উদ্ধৃতিগুলির ভিতরে অংশটি সন্ধান করে। এটি প্রথমে সমস্ত ডাবল উদ্ধৃতি সম্প্রসারণ সম্পাদন করে। যদি স্ট্রিংটি অনুবাদ ডাটাবেসে পাওয়া যায় না, তবে এটি তার নিজস্ব অনুবাদ হিসাবে ব্যবহৃত হবে। অন্তর্নির্মিত অনুমানটি হ'ল স্ট্রিংগুলি ইংরেজিতে।

আপনি সম্ভবত এটি ব্যবহার করতে চান না, তবে আপনি যদি এটি দেখতে পান তবে আপনি সাধারণত এটি নিয়মিত ডাবল উক্তি হিসাবে বিবেচনা করতে পারেন।


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

printf 'New path: \e[1m%s\e[0m' "/pkg/bin:$PATH:"

এটি স্পষ্টভাবে পৃথক করে কোন অংশগুলি অক্ষর থেকে বেরিয়ে আসার বিষয় এবং কোনটি ডেটা মান।

আর একটি হ'ল উদ্ধৃতি দেওয়ার সমস্ত শৈলী শেলের মধ্যে একটি একক "শব্দ" তৈরি করে, যদি না ডাবল উদ্ধৃতিগুলির মধ্যে $@অ্যারে প্রসারণ ${x[@]}ব্যবহৃত হয়। উভয় একক-উদ্ধৃতি ফর্ম সর্বদা এক শব্দ এবং আর কখনও প্রসারিত হয় না।


$"..."ksh93 থেকেও রয়েছে, ২.০ এ বশ যোগ হয়েছে।
স্টাফেন চেজেলাস

কোন ব্যাপার \cXমধ্যে zsh। এটি \CXবা \C-Xসেখানে ( \cইতিমধ্যে এর একটি বিশেষ অর্থ রয়েছে echo)
স্টাফেন চেজেলাস

'let x="'$PATH\"ছাড়া অন্য শেল তালিকায় প্রেক্ষিতে ভুল zshহিসাবে $PATHউদ্ধৃত করা হয় না (তাই + + উল্লিখিত glob যা আপনি এখানে নেই চাইবেন বিভক্ত সাপেক্ষে হতে হবে)।
স্টাফেন চেজেলাস

আপনি স্পষ্ট করে বলতে পারেন যে আপনি কর্ন-এর মতো শেলগুলির কথা বলছেন, কোট প্রসেসিং সিএসএস, আরসি,
ফিশে

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