"ইকো-ই" কমান্ডগুলি সঠিক আউটপুট উত্পাদন করে বলে মনে হচ্ছে না কেন?


21

উবুন্টু 18.04 এলটিএস-এর টার্মিনালে, যখন আমি এই আদেশটি লিখি:

echo -e "Hello\\\n"

এটি এটিকে আউটপুট হিসাবে দেয়:

Hello\n

তবে এটি মুদ্রণ করা উচিত, যেমন ম্যান পেজ বলে:

Hello\

এটি হ'ল প্রথমে মুদ্রণ করুন Hello, তারপরে \একটি নতুন লাইন অক্ষর (এবং তারপরে অন্য একটি নতুন লাইন)। সমস্যা কোথায়?

এই কয়েকটি echo -eকমান্ড এবং তাদের আউটপুট দেখুন :

man420@man420-X542UQ:~$ echo -e "HEllo\a\a\a\a\a\a\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\a\\\n"
HEllo\n

yes.for প্রথম 2 \ এটি করা উচিত আউটপুট একটি \ .এবং গত \ এবং n একটি ব্যাকস্ল্যাশ পালাবার \ N (নতুন লাইন) .so কেন এটা হ্যালো প্রিন্ট করা উচিত \ করা
yolin00

1
উদ্ধৃতি ব্যতীত চেষ্টা করুন।
অজগ্রিংগো 619

2
এলিয়াহ কাগান একটি আশ্চর্যজনক উত্তর সরবরাহ করেছিলেন, যা আপনার গ্রহণ করা উচিত।
ভ্যানিয়ামিয়াম

2
echoপ্রথম স্থানে ব্যবহার করবেন না : ব্যবহার করুন printf
চিপনার

2
আপনি যা লিখেন তা নিশ্চিতভাবেই আর্গুমেন্ট হিসাবে কমান্ডের কাছে যা পাঠানো হয়েছে তা নিশ্চিত হতে চাইলে সর্বদা একক উদ্ধৃতি ব্যবহার করুন।
গিয়াকোমো আলজেটা

উত্তর:


29

ব্যাকস্ল্যাশ বিশেষভাবে দ্বারা চিকিত্সা করা হয় echo -e, কিন্তু প্রথমে তারা হয় কখনও কখনও শেল (যা এই ক্ষেত্রে হয় বিশেষভাবে চিকিত্সা bash,) শেল অনুযায়ী উদ্ধৃত নিয়ম।

যুক্তিটি echoআসলে দেখেছে Hello\\nআপনি চলে গেছেন -eবলে echo, এটি ব্যাকস্ল্যাশটি বিশেষভাবে পালিয়ে যায় বলে বিবেচনা করে এবং \\একটিতে পড়ে যায় \। ফাইনালটি nএড়ায় না, তাই এটি আক্ষরিকভাবে উপস্থিত হয়।

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

শেলটি যখন কোনও কমান্ডে ডাবল-কোটেড পাঠ্যের মুখোমুখি হয় "Hello\\\n", \তখন এটি পালাবার চরিত্র হিসাবে বিবেচিত হয় যখন এমন কোনও চরিত্রের আগে থাকে যা ডাবল কোটের ভিতরে নিজেই বিশেষ অর্থ রাখতে পারে এবং অন্যথায় নয়

  1. কারণ \মাঝে মাঝে ভিতরে একটি বিশেষ অর্থ থাকে "", \যা অন্যের আগে তাত্ক্ষণিকভাবে \তার দ্বিতীয়টি উদ্ধৃত করার প্রভাব ফেলে \। সুতরাং ডাবল উদ্ধৃতি ভিতরে, প্রথমটি \\ধসে পড়েছে \
  2. এই প্রথম দুটি \চরিত্রের পরে , একটি তৃতীয় \অক্ষর রয়েছে যা সেই প্রথম দুটি দ্বারা প্রভাবিত হয় না এবং এটি পূর্ববর্তী দুটি হয় n। তবে nএমন কোনও চরিত্র নয় যা কখনও ডাবল কোটসের অভ্যন্তরে বিশেষভাবে চিকিত্সা করা হয়, সুতরাং \এই পরিস্থিতিতে বিশেষভাবে এটির আগে চিকিত্সা করা হয় না। এভাবেই \nথাকে \n

এর প্রভাবটি হ'ল ডাবল উক্তিগুলিতে \\\nব্যাখ্যা করা হয় \\n

যখন echo -eদেখা যায় \\n, প্রথমটি \দ্বিতীয় থেকে বিশেষ অর্থ সরিয়ে দেয়, সুতরাং পাঠ্যের জন্য আক্ষরিক echoমুদ্রণ করে \n


আপনার লক্ষ্য প্রিন্ট করতে হয়, তাহলে Helloএকটি অতিরিক্ত সম্পর্কে newline কিন্তু কোন ব্যাকস্ল্যাশ সঙ্গে (প্রশ্ন প্রকৃতপক্ষে এই সম্পর্কে দ্ব্যর্থক ছিল, প্লাস আমি মনে করি এটা একটি দরকারী উদাহরণ), তারপর এক সমাধান অপসারণ করা হয় \। শেষে অতিরিক্ত নিউলাইন দিয়ে echo -e "Hello\\n"আউটপুটগুলি চালানো Hello

একটি ভাল সমাধান হ'ল একক উদ্ধৃতি ব্যবহার এবং লিখুন echo -e 'Hello\n'। একক উদ্ধৃতি উদ্ধৃতি শক্তিশালী ফর্ম। একটি আরও ভাল সমাধান সাধারণত printfপরিবর্তে ব্যবহার করা হয় echo, যা এই ক্ষেত্রে হবে printf 'Hello\n\n'

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

এটি একক উদ্ধৃতি দেওয়ার সুবিধাটি চিত্রিত করে: আপনি যা echo -eদেখতে চান তা একক উদ্ধৃতি ( echo -e 'Hello\\\n') এর মধ্যে রাখুন। printfএখানেও ভাল। এক বিকল্প printf 'Hello\\\n\n'। তবে যেখানে printfসত্যই জ্বলজ্বল তা হ'ল আপনি অতিরিক্ত যুক্তি যুক্ত করতে পারেন। আপনি ব্যবহার করতে পারেন printf '%s\n\n' 'Hello\', যা দ্বিতীয় যুক্তি সন্নিবেশ করে (আক্ষরিক Hello\কারণ একক উদ্ধৃতি কিছু পরিবর্তন করে না) %s

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