প্রতিধ্বনি কেন আমার উদ্ধৃতি চরিত্রগুলি উপেক্ষা করছে?


24

echoকমান্ড সম্পূর্ণ টেক্সট যে আমি এটা দিতে সহ করা হয় না। উদাহরণস্বরূপ, যদি আমি করি:

   $ echo ' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print $2}' `    '

এটি ফলাফল:

echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk {print } `

'আমার ইকো কমান্ডটিতে থাকা একক উদ্ধৃতি ( ) অন্তর্ভুক্ত নেই। যদি আমি ডাবল উদ্ধৃতিতে স্যুইচ করি:

$ echo " echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print $2}' `  "

echoকিছুতেই আউটপুট দেয় না! কেন এটি প্রথম উদাহরণে একক উদ্ধৃতিগুলি ছেড়ে যাচ্ছে এবং দ্বিতীয়টিতে কিছুই আউটপুট দিচ্ছে না? আমি টাইপ করা ঠিক কীভাবে এটি আউটপুট পেতে পারি?


3
আপনি এখানে কী অর্জন করতে চাইছেন তা পুরোপুরি নিশ্চিত নয়। কেন আপনি অন্য একটি প্রতিধ্বনি বিবরণ বাসা বাঁধছেন? বা আপনি কি আক্ষরিক অর্থে একটি কমান্ড মুদ্রণের চেষ্টা করছেন (উদাহরণস্বরূপ বা এরকম)?
অ্যান্ডি স্মিথ

আমাকে অন্য একটি ফাইলের প্রতিধ্বনি

আপনি যা করার চেষ্টা করছেন তা আপনাকে ব্যাখ্যা করতে হবে। যেমন "আমি নীচের পাঠ্যটি সংযুক্ত করতে চাই: '...' কোনও ফাইলে।"
মাইকিবি

2
আমি এটি 5 মিনিটের জন্য সম্পাদনা করার চেষ্টা করেছি তবে পছন্দসই ফলাফলটি কী তা আমি গুরুত্ব সহকারে জানি না। সম্পাদনা : ঠিক আছে, আমার মনে হয় এখন আমার একটি অনুমান আছে, তাই আমি সম্পাদনা করার চেষ্টা করেছি। আপনি যদি ইচ্ছা করেন তা না হলে আমাকে জানান
মাইকেল মরোজেক

1
@ মিশেল - বাহ - যদি আমি আপনার সম্পাদনার জন্য কিছু প্রতিনিধি দিতে পারি, তবে আমি - এটি একটি দুর্দান্ত প্রশ্ন তৈরি করে খুব ভাল কাজ!
রান্ডাল

উত্তর:


33

আপনার শেলটি কোট করার আগে উভয় 'এবং উভয়ই কোটকে ব্যাখ্যা করে । আমি সাধারণত আমার যুক্তির চারপাশে ডাবল উদ্ধৃতিগুলি প্রতিধ্বনিত করে এমনকি যদি তারা অপ্রয়োজনীয় হয়; উদাহরণ স্বরূপ:"echo

$ echo "Hello world"
Hello world

সুতরাং আপনার প্রথম উদাহরণে, আপনি যদি নিজের আউটপুটে আক্ষরিক উক্তি চিহ্নগুলি অন্তর্ভুক্ত করতে চান তবে সেগুলি হয় পালাতে হবে:

$ echo \'Hello world\'
'Hello world'

বা এগুলি ইতিমধ্যে একটি উদ্ধৃত যুক্তির মধ্যে ব্যবহার করা দরকার (তবে এটি একই ধরণের উদ্ধৃতি হতে পারে না, তবে আপনাকে যেভাবেই এড়িয়ে যেতে হবে):

$ echo "'Hello world'"
'Hello world'

$ echo '"Hello world"'
"Hello world"

আপনার দ্বিতীয় উদাহরণে, আপনি স্ট্রিংয়ের মাঝখানে একটি কমান্ড প্রতিস্থাপন চালাচ্ছেন:

grep  $ARG  /var/tmp/setfile  | awk {print $2}

যেগুলি দিয়ে শুরু হয় $সেগুলি শেল দ্বারা বিশেষভাবে পরিচালনা করা হয় - এটি তাদেরকে ভেরিয়েবল হিসাবে বিবেচনা করে এবং তাদের মানগুলির সাথে প্রতিস্থাপন করে। যেহেতু সম্ভবত খুব সহজেই এই শেরাগুলির দুটিই আপনার শেলের মধ্যে সেট করা নেই, এটি আসলে চালিত হয়

grep /var/tmp/setfile | awk {print}

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

আপনি যদি আর্গুমেন্টটি এককভাবে উদ্ধৃত করেন (তবে এটিই আপনার প্রথম উদাহরণটি প্রায় কাজ করেছিল), তবে আপনার আউটপুটটি পাওয়ার এটি একটি উপায়:

echo \'' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print $2}' `    '\'

আপনি এটির দ্বিগুণ-উদ্ধৃতিও দিতে পারেন, তবে তারপরে আপনাকে পালাতে হবে $যাতে শেলটি তাদের পরিবর্তনশীল হিসাবে সমাধান না করে এবং ব্যাকটিক্স দেয় যাতে শেলটি এখনই কমান্ড প্রতিস্থাপনটি চালায় না:

echo "' echo PARAM=\`  grep  \$ARG  /var/tmp/setfile  | awk '{print \$2}' \`    '"

7

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

একক উদ্ধৃতিতে কোনও উদ্ধৃতি নেই, সুতরাং আপনি একক উদ্ধৃতিযুক্ত স্ট্রিংয়ের ভিতরে একটি একক উদ্ধৃতি রাখতে পারবেন না। এটির মতো দেখতে এমন একটি প্রতিমা রয়েছে:

echo 'foo'\''bar'

এই মুদ্রণগুলি foo'bar, কারণটির যুক্তিটি echoএকক-উদ্ধৃত তিন-অক্ষরের স্ট্রিং দ্বারা তৈরি foo, একক অক্ষর '( 'পূর্বের মাধ্যমে চরিত্রটিকে এর বিশেষ অর্থ থেকে রক্ষা করে প্রাপ্ত) দ্বারা \একত্রিত, একক-উদ্ধৃত তিন-চরিত্রের স্ট্রিংয়ের সাথে সংযুক্ত bar। সুতরাং পর্দার আড়ালে যেটি ঘটে তা পুরোপুরি না হলেও, আপনি '\''একক উদ্ধৃতিযুক্ত স্ট্রিংয়ের মধ্যে একটি একক উদ্ধৃতি অন্তর্ভুক্ত করার উপায় হিসাবে ভাবতে পারেন ।

আপনি যদি জটিল মাল্টলাইন স্ট্রিং মুদ্রণ করতে চান তবে একটি ভাল সরঞ্জাম হ'ল ডকুমেন্ট । এখানে একটি নথিতে দুটি অক্ষর রয়েছে যার <<পরে একটি চিহ্নিতকারী যেমন <<EOFকিছু পাঠ্য রেখা থাকে, তারপরে শেষের চিহ্নিতকারীটি তার লাইনে একা থাকে। যদি চিহ্নিতকারীকে কোনও উপায়ে উদ্ধৃত করা হয় ( 'EOF'বা "EOF"বা \EOF"ই" "অফ" বা…), তবে পাঠ্যের আক্ষরিক অর্থে ব্যাখ্যা করা হয় (একক উদ্ধৃতির অভ্যন্তরের মতো এটি এমনকি 'একটি সাধারণ চরিত্র বাদে )। যদি চিহ্নিতকারীটিকে মোটেও উদ্ধৃত না করা হয়, তবে পাঠ্যটির $\`বিশেষ মর্যাদা ধরে রাখার সাথে দ্বিগুণ-উদ্ধৃত স্ট্রিংয়ের মতো ব্যাখ্যা করা হবে (তবে "নিউলাইনগুলি আক্ষরিক অর্থে ব্যাখ্যা করা হয়)।

cat <<'EOF'
echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print $2}' `
EOF

1

ঠিক আছে, এটি কাজ করবে: -

echo ' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '\''{print $2}'\'' `    '

এটি এখানে পরীক্ষা করা: -

[asmith@yagi ~]$ echo ' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '\''{print $2}'\'' `    '
 echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print $2}' ` 

0

এখানে ডকুমেন্ট ব্যবহারের জন্য গিলসের পরামর্শটি খুব সুন্দর, এমনকি পার্লের মতো স্ক্রিপ্টিং ভাষার মধ্যেও কাজ করে। ওপি-র ইস্যুতে তার উত্তরের ভিত্তিতে একটি নির্দিষ্ট উদাহরণ হিসাবে,

use strict;
my $cmd = q#cat <<'EOF' # . "\n" .
          q#echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print $2}' `# . "\n" .
          q#EOF# ;
open (my $OUTPUT, "$cmd |");
print $_ while <$OUTPUT>;
close $OUTPUT;

মঞ্জুর, এই উদাহরণটি কিছুটা স্বীকৃত তবে এটি এসকিউএল স্টেটমেন্টগুলি psql(পরিবর্তে cat) প্রেরণ করার জন্য এটি একটি দরকারী কৌশল বলে মনে করেছি ।

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


-1

আপনার আদেশ গ্রহণ করা যাক

$ echo ' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print $2}' `    '

এবং প্রথমে শব্দের মধ্যে বিভক্ত করুন, অনুমানিত সাদা স্থানকে ডিলিমিটার হিসাবে ব্যবহার করে:

Arg[1]=“' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print”
Arg[2]=“$2}' `    '”

এর পরে, আমরা প্যারামিটার সম্প্রসারণ করি: প্রসারিত $…তবে ভিতরে নয় '…'। যেহেতু $2খালি (যদি আপনি এটি উদাহরণস্বরূপ সেট না করেন set -- …), এটি একটি খালি স্ট্রিং দ্বারা প্রতিস্থাপন করা হবে।

Arg[1]=“' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '{print”
Arg[2]=“}' `    '”

এরপরে, উদ্ধৃতি অপসারণ করুন।

Arg[1]=“ echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk {print”
Arg[2]=“} `    ”

এই আর্গুমেন্টগুলি পরে প্রতিধ্বনিতে প্রেরণ করা হবে যা এগুলি একের পর এক মুদ্রণ করে একক স্থান দ্বারা পৃথক করা হবে।

“ echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk {print } `    ”

আমি আশা করি যে এই ধাপে ধাপে নির্দেশ পালন করা আচরণকে আরও পরিষ্কার করে তোলে। সমস্যাটি এড়ানোর জন্য, একক উদ্ধৃতিগুলি এর মতো এড়িয়ে চলুন:

$ echo ' echo PARAM=`  grep  $ARG  /var/tmp/setfile  | awk '\''{print $2}'\'' `    '

এটি একক-উদ্ধৃত স্ট্রিংটি সমাপ্ত করবে, তারপরে শব্দের সাথে একটি (পালিয়ে যাওয়া) একক উদ্ধৃতি যুক্ত করবে, তারপরে শব্দটি না ভেঙে একটি নতুন একক-উদ্ধৃত স্ট্রিং শুরু করবে।

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