উত্তর:
একক উদ্ধৃতি কোনোক্রমে বিভক্ত হবে না, তবে ডাবল উদ্ধৃতি হবে। উদাহরণস্বরূপ: ভেরিয়েবল, ব্যাকটিকস, নির্দিষ্ট পালানো \
ইত্যাদি
উদাহরণ:
$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")
বাশ ম্যানুয়ালটির এই কথাটি রয়েছে:
একক উদ্ধৃতিতে অক্ষরগুলি আবদ্ধ করা (
'
) উদ্ধৃতিগুলির মধ্যে প্রতিটি অক্ষরের আক্ষরিক মান সংরক্ষণ করে। ব্যাকস্ল্যাশ এর আগেও, একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতি নাও উপস্থিত হতে পারে।ডবল কোট অক্ষর আবদ্ধ (
"
) কোট মধ্যে সব অক্ষরের আক্ষরিক মান অপরিবর্তিত, ব্যতিক্রম$
,`
,\
, এবং, যখন ইতিহাস সম্প্রসারণ সক্ষম হলে,!
। অক্ষরগুলি$
এবং`
ডাবল উদ্ধৃতিগুলির মধ্যে তাদের বিশেষ অর্থ ধরে রাখে ( শেল বিস্তৃতি দেখুন )। যখন নিম্নলিখিত অক্ষরগুলি এক দ্বারা অনুসৃত ব্যাকস্ল্যাশ শুধুমাত্র তার বিশেষ অর্থ বজায়:$
,`
,"
,\
, বা নিউলাইন। ডাবল উদ্ধৃতিগুলির মধ্যে, এই অক্ষরের একটি অনুসরণ করা ব্যাকস্ল্যাশগুলি সরানো হবে। বিশেষ অর্থ ব্যতীত পূর্ববর্তী অক্ষরগুলি ব্যাকস্ল্যাশগুলি অবিস্মরণীয় রেখে দেওয়া হয়েছে। একটি ডাবল উদ্ধৃতি এটি একটি ব্যাকস্ল্যাশ সঙ্গে পূর্ববর্তী দ্বারা ডাবল উদ্ধৃতি মধ্যে উদ্ধৃত করা যেতে পারে। যদি সক্ষম করা থাকে তবে!
ডাবল উদ্ধৃতিতে উপস্থিত কোনও ব্যাকস্ল্যাশ ব্যবহার করে এড়িয়ে যাওয়া অবধি ইতিহাসের সম্প্রসারণ করা হবে । এর আগের ব্যাকস্ল্যাশ!
সরানো হয়নি।বিশেষ পরামিতি
*
এবং@
যখন উদ্ধৃতি চিহ্ন মধ্যে (দেখুন বিশেষ অর্থ আছে শেল প্যারামিটার সম্প্রসারণ )।
git_prompt
এই গিটটি ব্যবহার করছেন তখন তারা কীভাবে এটি ব্যবহার করা উচিত নয় PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
, গিট প্রম্পট হিসাবে এটি ব্যবহার করার পরামর্শ দেয় about PS#
ভেরিয়েবল সম্পর্কে কিছু বিশেষ আছে ? বা যদি এটি অন্তরবৃত্তির কাজ না করে তবে এটি কেন কাজ করে।
PS1
। echo $PS1
আমার অর্থ কী তা দেখার চেষ্টা করুন । তবে PS1
প্রদর্শিত হওয়ার আগে মূল্যায়ন করা হয় ( PROMPTING
ব্যাশ ম্যানপেজের বিভাগটি দেখুন )। এটি পরীক্ষা করার জন্য, চেষ্টা করুন PS1='$X'
। আপনার কোন প্রম্পট হবে না। তারপরে চালান X=foo
এবং হঠাৎ আপনার প্রম্পটটি "foo" হয় ( প্রদর্শিত হওয়ার পরিবর্তে সেট করার PS1
সময় মূল্যায়ন করা হয়েছিল তখনও আপনার কোনও প্রম্পট থাকবে না)।
গৃহীত উত্তর মহান। আমি একটি টেবিল তৈরি করছি যা বিষয়টির দ্রুত উপলব্ধিতে সহায়তা করে। ব্যাখ্যাটিতে একটি সাধারণ ভেরিয়েবলের 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
---+-------------+-------------+--------------------------------------------------------------------
আরো দেখুন:
The special parameters * and @ have special meaning when in double quotes
তাই "*"
ফলাফল কীভাবে আসবে *
?
"$@"
এবং "$*"
প্যারামিটার বিস্তৃতি হয়। "@"
এবং "*"
না।
echo "\'"
আমাকে ফেরত দেয় \'
।
আপনি যদি কোনও কিছু প্রতিধ্বনিত করেন তখন আপনি যা ঘটে তা উল্লেখ করছেন, একক উদ্ধৃতিগুলি আক্ষরিক অর্থে আপনার মধ্যে যা আছে তা প্রতিধ্বনিত করবে, যখন ডাবল উদ্ধৃতিগুলি তাদের মধ্যে ভেরিয়েবলগুলি মূল্যায়ন করবে এবং ভেরিয়েবলের মান আউটপুট করবে।
উদাহরণস্বরূপ, এটি
#!/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
অন্যরা খুব ভাল ব্যাখ্যা করেছেন এবং কেবল সহজ উদাহরণ দিয়ে দিতে চান।
শেলটি কোনও বিশেষ অক্ষরের ব্যাখ্যা থেকে রোধ করতে পাঠ্যগুলির চারপাশে একক উদ্ধৃতি ব্যবহার করা যেতে পারে। ডলার চিহ্ন, স্পেস, অ্যাম্পারস্যান্ডস, অ্যাসিরিস্টস এবং অন্যান্য বিশেষ অক্ষরগুলি যখন একক উদ্ধৃতিতে আবদ্ধ থাকে তখন এগুলি উপেক্ষা করা হয়।
$ 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
সেখানে ব্যবহার মধ্যে একটি স্পষ্ট পার্থক্য ' '
এবং " "
।
যখন ' '
কোনও কিছুর চারপাশে ব্যবহৃত হয়, তখন কোনও "রূপান্তর বা অনুবাদ" করা হয় না। এটি যেমনটি মুদ্রিত হয় তেমন।
এর সাথে " "
, এর চারপাশে যা কিছু হোক না কেন, তার মানতে "অনুবাদিত বা রূপান্তরিত" হয়।
অনুবাদ / রূপান্তর দ্বারা আমি নিম্নলিখিতটি বোঝাতে চাইছি: একক উদ্ধৃতিগুলির মধ্যে যে কোনও কিছুই তাদের মানগুলিতে "অনুবাদ" হবে না। তারা উদ্ধৃতিগুলির অভ্যন্তরে থাকায় তাদের নেওয়া হবে। উদাহরণ :, a=23
তারপরে স্ট্যান্ডার্ড আউটপুট echo '$a'
তৈরি করবে $a
। যেখানে স্ট্যান্ডার্ড আউটপুট echo "$a"
উত্পাদিত হবে 23
।
যেহেতু কোটগুলি নিয়ে কাজ করার সময় এটিই ডি-ফ্যাক্টোর উত্তর 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
।
$((...))
। এটি "সামান্য" IFS=0
$[[...]]
বাক্য গঠনটিও রয়েছে তবে সম্ভবত আপনি এটি ভুলে গিয়েছিলেন।