বাশের একক এবং ডাবল উদ্ধৃতিগুলির মধ্যে পার্থক্য


567

বাশ-এ, একক উদ্ধৃতি ( '') এবং ডাবল উদ্ধৃতি ( "") এর মধ্যে পার্থক্য কী ?


1
আরও দেখুন (একটি সম্ভাব্য ক্রস-সাইটের সদৃশ): "…", '...', $ '…', এবং $ "…" উদ্ধৃতিগুলির মধ্যে পার্থক্য কী? থেকে ইউনিক্স ও লিনাক্স স্ট্যাক এক্সচেঞ্জ
rugk

উত্তর:


576

একক উদ্ধৃতি কোনোক্রমে বিভক্ত হবে না, তবে ডাবল উদ্ধৃতি হবে। উদাহরণস্বরূপ: ভেরিয়েবল, ব্যাকটিকস, নির্দিষ্ট পালানো \ইত্যাদি

উদাহরণ:

$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")

বাশ ম্যানুয়ালটির এই কথাটি রয়েছে:

3.1.2.2 একক মূল্য

একক উদ্ধৃতিতে অক্ষরগুলি আবদ্ধ করা ( ') উদ্ধৃতিগুলির মধ্যে প্রতিটি অক্ষরের আক্ষরিক মান সংরক্ষণ করে। ব্যাকস্ল্যাশ এর আগেও, একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতি নাও উপস্থিত হতে পারে।

৩.১.২.৩ ডাবল উক্তি

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

বিশেষ পরামিতি *এবং @যখন উদ্ধৃতি চিহ্ন মধ্যে (দেখুন বিশেষ অর্থ আছে শেল প্যারামিটার সম্প্রসারণ )।


40
যে কেউ "ইন্টারপোলেট" এর অর্থ জানেন না তাদের জন্য: এন.ইউইকিপিডিয়া.আর
উইকি

আপনি যখন git_promptএই গিটটি ব্যবহার করছেন তখন তারা কীভাবে এটি ব্যবহার করা উচিত নয় PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ', গিট প্রম্পট হিসাবে এটি ব্যবহার করার পরামর্শ দেয় about PS#ভেরিয়েবল সম্পর্কে কিছু বিশেষ আছে ? বা যদি এটি অন্তরবৃত্তির কাজ না করে তবে এটি কেন কাজ করে।
একাইম

@ আইকিম যে সঠিক পাঠ্যটি সেট করা আছে (অপরিবর্তিত) তাতে PS1echo $PS1আমার অর্থ কী তা দেখার চেষ্টা করুন । তবে PS1প্রদর্শিত হওয়ার আগে মূল্যায়ন করা হয় ( PROMPTINGব্যাশ ম্যানপেজের বিভাগটি দেখুন )। এটি পরীক্ষা করার জন্য, চেষ্টা করুন PS1='$X'। আপনার কোন প্রম্পট হবে না। তারপরে চালান X=fooএবং হঠাৎ আপনার প্রম্পটটি "foo" হয় ( প্রদর্শিত হওয়ার পরিবর্তে সেট করার PS1সময় মূল্যায়ন করা হয়েছিল তখনও আপনার কোনও প্রম্পট থাকবে না)।
অ্যাডাম বাটকিন

262

গৃহীত উত্তর মহান। আমি একটি টেবিল তৈরি করছি যা বিষয়টির দ্রুত উপলব্ধিতে সহায়তা করে। ব্যাখ্যাটিতে একটি সাধারণ ভেরিয়েবলের aপাশাপাশি একটি সূচকযুক্ত অ্যারেও জড়িত arr

যদি আমরা সেট

a=apple      # a simple variable
arr=(apple)  # an indexed array with a single element

এবং তারপরে echoদ্বিতীয় কলামে প্রকাশ, আমরা তৃতীয় কলামে ফলাফল / আচরণটি পেয়ে যাব। চতুর্থ কলামটি আচরণের ব্যাখ্যা দেয়।

 # | Expression  | Result      | Comments
---+-------------+-------------+--------------------------------------------------------------------
 1 | "$a"        | apple       | variables are expanded inside ""
 2 | '$a'        | $a          | variables are not expanded inside ''
 3 | "'$a'"      | 'apple'     | '' has no special meaning inside ""
 4 | '"$a"'      | "$a"        | "" is treated literally inside ''
 5 | '\''        | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting)
 6 | "red$arocks"| red         | $arocks does not expand $a; use ${a}rocks to preserve $a
 7 | "redapple$" | redapple$   | $ followed by no variable name evaluates to $
 8 | '\"'        | \"          | \ has no special meaning inside ''
 9 | "\'"        | \'          | \' is interpreted inside "" but has no significance for '
10 | "\""        | "           | \" is interpreted inside ""
11 | "*"         | *           | glob does not work inside "" or ''
12 | "\t\n"      | \t\n        | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting
13 | "`echo hi`" | hi          | `` and $() are evaluated inside ""
14 | '`echo hi`' | `echo hi`   | `` and $() are not evaluated inside ''
15 | '${arr[0]}' | ${arr[0]}   | array access not possible inside ''
16 | "${arr[0]}" | apple       | array access works inside ""
17 | $'$a\''     | $a'         | single quotes can be escaped inside ANSI-C quoting
18 | "$'\t'"     | $'\t'       | ANSI-C quoting is not interpreted inside ""
19 | '!cmd'      | !cmd        | history expansion character '!' is ignored inside ''
20 | "!cmd"      | cmd args    | expands to the most recent command matching "cmd"
21 | $'!cmd'     | !cmd        | history expansion character '!' is ignored inside ANSI-C quotes
---+-------------+-------------+--------------------------------------------------------------------

আরো দেখুন:


1
গৃহীত উত্তর শেষ বলে The special parameters * and @ have special meaning when in double quotesতাই "*"ফলাফল কীভাবে আসবে *?
আন্ডেরো

2
@ কার্ল-অ্যান্ডেরো ম্যারে, কারণ সেগুলিতে মোটেও পরামিতি হিসাবে প্রসারিত হয়নি। "$@"এবং "$*"প্যারামিটার বিস্তৃতি হয়। "@"এবং "*"না।
চার্লস ডাফি

@ চার্লসডাফি ধন্যবাদ, এখনই তা বোধ হয়!
অ্যান্ডেরো

3
9 নম্বর, echo "\'"আমাকে ফেরত দেয় \'
ম্যাক্সগাইভার

@ ম্যাক্সজিভার: এটি দেখানোর জন্য ধন্যবাদ। আমি উত্তর আপডেট করেছি।
কোডফোরস্টার

233

আপনি যদি কোনও কিছু প্রতিধ্বনিত করেন তখন আপনি যা ঘটে তা উল্লেখ করছেন, একক উদ্ধৃতিগুলি আক্ষরিক অর্থে আপনার মধ্যে যা আছে তা প্রতিধ্বনিত করবে, যখন ডাবল উদ্ধৃতিগুলি তাদের মধ্যে ভেরিয়েবলগুলি মূল্যায়ন করবে এবং ভেরিয়েবলের মান আউটপুট করবে।

উদাহরণস্বরূপ, এটি

#!/bin/sh
MYVAR=sometext
echo "double quotes gives you $MYVAR"
echo 'single quotes gives you $MYVAR'

এটি দেবে:

double quotes gives you sometext
single quotes gives you $MYVAR

11

অন্যরা খুব ভাল ব্যাখ্যা করেছেন এবং কেবল সহজ উদাহরণ দিয়ে দিতে চান।

শেলটি কোনও বিশেষ অক্ষরের ব্যাখ্যা থেকে রোধ করতে পাঠ্যগুলির চারপাশে একক উদ্ধৃতি ব্যবহার করা যেতে পারে। ডলার চিহ্ন, স্পেস, অ্যাম্পারস্যান্ডস, অ্যাসিরিস্টস এবং অন্যান্য বিশেষ অক্ষরগুলি যখন একক উদ্ধৃতিতে আবদ্ধ থাকে তখন এগুলি উপেক্ষা করা হয়।

$ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.' 

এটি এটি দেবে:

All sorts of things are ignored in single quotes, like $ & * ; |.

একক উদ্ধৃতিতে একমাত্র যে জিনিসটি রাখা যায় না তা হ'ল একক উদ্ধৃতি।

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

$ echo "Here's how we can use single ' and double \" quotes within double quotes"

এটি এটি দেবে:

Here's how we can use single ' and double " quotes within double quotes

এও লক্ষ্য করা যেতে পারে যে অ্যাস্টোস্ট্রোফ, যা অন্যথায় উদ্ধৃত স্ট্রিংয়ের সূচনা হিসাবে ব্যাখ্যা করা হবে, ডাবল উদ্ধৃতিতে উপেক্ষা করা হবে। ভেরিয়েবলগুলি অবশ্য ডাবল কোটের মধ্যে তাদের মানগুলির সাথে ব্যাখ্যা এবং পরিবর্তিত হয়।

$ echo "The current Oracle SID is $ORACLE_SID"

এটি এটি দেবে:

The current Oracle SID is test

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

$ today=`date '+%A, %B %d, %Y'`
$ echo $today 

এটি এটি দেবে:

Monday, September 28, 2015 

3

সেখানে ব্যবহার মধ্যে একটি স্পষ্ট পার্থক্য ' 'এবং " "

যখন ' 'কোনও কিছুর চারপাশে ব্যবহৃত হয়, তখন কোনও "রূপান্তর বা অনুবাদ" করা হয় না। এটি যেমনটি মুদ্রিত হয় তেমন।

এর সাথে " ", এর চারপাশে যা কিছু হোক না কেন, তার মানতে "অনুবাদিত বা রূপান্তরিত" হয়।

অনুবাদ / রূপান্তর দ্বারা আমি নিম্নলিখিতটি বোঝাতে চাইছি: একক উদ্ধৃতিগুলির মধ্যে যে কোনও কিছুই তাদের মানগুলিতে "অনুবাদ" হবে না। তারা উদ্ধৃতিগুলির অভ্যন্তরে থাকায় তাদের নেওয়া হবে। উদাহরণ :, a=23তারপরে স্ট্যান্ডার্ড আউটপুট echo '$a'তৈরি করবে $a। যেখানে স্ট্যান্ডার্ড আউটপুট echo "$a"উত্পাদিত হবে 23


1
"অনুবাদ" বা "রূপান্তর" বলতে আপনার অর্থ কী?
নিকো হাজে

এই উত্তরটি বেশ বিভ্রান্তিকর এবং এটি বিদ্যমান ভাল উত্তরের উপরে কিছুই যুক্ত করে না।
কোডফোরস্টার

2
এটি অত্যধিক শব্দযুক্ত না হয়ে আমার মতে একটি সংক্ষিপ্ত সংক্ষিপ্ত উত্তর ছিল যা আমার পক্ষে উপলব্ধি করা সহজ। অনুবাদ / রূপান্তর বলার সময় এগুলি অর্থ ডাবল উদ্ধৃতিগুলি ভেরিয়েবল প্রসারিত হবে যেখানে একক উদ্ধৃতিগুলি ভেরিয়েবলটি প্রসারিত করবে না।
বি_ই_এন_ এন_ই_

1
হ্যাঁ, এটি সেরা উত্তর। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
জামে কি

3

যেহেতু কোটগুলি নিয়ে কাজ করার সময় এটিই ডি-ফ্যাক্টোর উত্তর bash, আমি শেলের মধ্যে পাটিগণিত অপারেটরগুলির সাথে কথা বলার সময় উপরের উত্তরগুলিতে মিস হওয়া আরও একটি পয়েন্ট যুক্ত করব।

bashশেল দুটি উপায়ে গাণিতিক অপারেশন না সমর্থন করে, এক দ্বারা সংজ্ঞায়িত বিল্ট-ইন letকমান্ড $((..))অপারেটর। প্রাক্তন একটি গাণিতিক ভাবটি মূল্যায়ন করেন যখন উত্তরোত্তর যৌগিক বিবৃতি বেশি।

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

ব্যবহার করার সময় এই উদাহরণটি দেখুন let

let 'foo = 2 + 1'
echo $foo
3

এখানে একক উদ্ধৃতি ব্যবহার করা একেবারে সূক্ষ্ম, কারণ এখানে পরিবর্তনশীল বিস্তারের প্রয়োজন নেই, এর একটি ক্ষেত্রে বিবেচনা করুন

bar=1
let 'foo = $bar + 1'

তীব্রভাবে ব্যর্থ হবে, যেহেতু $barআন্ডার সিঙ্গল কোটগুলি প্রসারিত হবে না এবং ডাবল-কোটেড হিসাবে প্রয়োজন

let 'foo = '"$bar"' + 1'

এটি অন্যতম কারণ হওয়া $((..))উচিত, সর্বদা ব্যবহারের ক্ষেত্রে বিবেচনা করা উচিত let। কারণ এর ভিতরে, বিষয়বস্তু শব্দ বিভাজনের বিষয় নয়। পূর্ববর্তী উদাহরণটি ব্যবহার করে letসহজভাবে লেখা যেতে পারে

(( bar=1, foo = bar + 1 ))

সর্বদা $((..))একক উদ্ধৃতি ব্যতীত ব্যবহার করতে ভুলবেন না

যদিও এটি $((..))ডাবল-কোট দিয়ে ব্যবহার করা যেতে পারে, এর কোনও উদ্দেশ্য নেই কারণ এর ফলস্বরূপ এমন কোনও সামগ্রী থাকতে পারে না যা ডাবল-কোটের প্রয়োজন হবে। এটি নিশ্চিত করুন যে এটি একক উদ্ধৃত হয়নি।

printf '%d\n' '$((1+1))'
-bash: printf: $((1+1)): invalid number
printf '%d\n' $((1+1))
2
printf '%d\n' "$((1+1))"
2

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

curl http://myurl.com --data-binary '{"requestCounter":'"$((reqcnt++))"'}'

ভিতরে নেস্টেড ডাবল-কোটসের ব্যবহারটি লক্ষ্য করুন, যা ছাড়া আক্ষরিক স্ট্রিংটি ক্ষেত্রটিতে $((reqcnt++))চলে যায় requestCounter


2
চার্লস ডাফি পাশাপাশি ডাবল উদ্ধৃতি দেওয়ার জন্য এখানে একটি ভাল কেস তৈরি করে $((...))। এটি "সামান্য" IFS=0
ভৌত

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