প্রতিধ্বনি ব্যবহার করার সময় কীভাবে নতুন লাইন যুক্ত করা যায়


42

নিম্নলিখিত কমান্ডটি উত্পন্ন ফাইলটিতে নতুন লাইন প্রবেশ করায় না এবং এর সমাধান কী?

$ echo "Line 1\r\nLine2" >> readme.txt

$ cat readme.txt 
Line 1\r\nLine2

6
Is echoবাধ্যতামূলক? আপনি ব্যবহার করতে পারেন printf
আর্কেমার

আমি প্রিন্টএফ সম্পর্কে জানতাম না, প্রিন্টফের সাহায্যে এটি কাজ করে: পি ... তাহলে এটি ইকো দিয়ে কাজ না করে কী করে?
সাইদ ইয়াজদানি

অর্থাৎ \rঅথবা এটা অংশ আউটপুটে অন্তর্ভুক্ত CRLFসম্পর্কে newline?
cuonglm

9
echoএকে অপরের সাথে বেমানান কমান্ডের অনেকগুলি বিভিন্ন বাস্তবায়ন রয়েছে । সুতরাং এটি হিসাবে আরও মানক সরঞ্জাম ব্যবহার করার পরামর্শ দেওয়া হয় printf। সমস্যার বর্ধিত ওভারভিউয়ের জন্য unix.stackexchange.com/questions/65803/… দেখুন ।
জিম্মিজ

উত্তর:


38

echo


echoসিঙ্গেল ইউনিক্সের নির্দিষ্টকরণের সাথে কঠোরভাবে মেনে চলে এমন একটি বাস্তবায়ন যদি আপনি এটি করেন তবে নতুন লাইন যুক্ত করবে:

echo 'line1\nline2'

তবে এটি নির্ভরযোগ্য আচরণ নয়। আসলে, সত্যিই নয় কোনো মান আচরণ যা তোমাদের আশা করতে পারেন echo

OPERANDS

string

স্ট্যান্ডার্ড স্ট্যান্ডার্ড আউটপুট লিখতে হবে। যদি প্রথম অপারেন্ড হয় -n, বা যদি কোনও অপারেন্ডে < \ব্যাকস্ল্যাশ> অক্ষর থাকে তবে ফলাফলগুলি বাস্তবায়ন-সংজ্ঞায়িত হয়

উপর XSI-conformant সিস্টেম, যদি প্রথম প্রতীক হয় -n, এটি একটি স্ট্রিং, হিসাবে গণ্য হইবে না একটি বিকল্প । নিম্নলিখিত অক্ষরের অনুক্রমগুলি যে কোনও আর্গুমেন্টের মধ্যে এক্সএসআই-কনফর্মেন্ট সিস্টেমগুলিতে স্বীকৃত হবে:

\a- একটি <ক্যালার্ট> লিখুন ।

\b- একটি <ব্যাকস্পেস> লিখুন ।

\c- অন্যথায় আউটপুটে চূড়ান্ত যুক্তি অনুসরণ করে এমন <নিউলাইন> টিপুন\cযুক্তি অনুসারে নিম্নলিখিত সমস্ত অক্ষর উপেক্ষা করা হবে।

\f- একটি <for-feed> লিখুন ।

\n- একটি <নিউলাইন> লিখুন ।

\r- একটি <ক্যারেজ- পুনর্বার> লিখুন ।

\t- একটি <ট্যাব> লিখুন ।

\v- একটি <versical-tab> লিখুন ।

\\- একটি <ব্যাকস্ল্যাশ> অক্ষর লিখুন ।

\0num- একটি 8-বিট মান লিখুন যা শূন্য, এক, দুই, বা তিন-অঙ্কের অক্টাল সংখ্যা num

এবং সুতরাং কীভাবে একটি নতুন লাইন লিখতে হবে তা জানার কোনও সাধারণ উপায় echoনেই, কেবলমাত্র আপনি কেবল এটি করার echoজন্য নির্ভর করতে পারেন।

একটি bashশেল সাধারণত স্পেসিফিকেশনটির সাথে সামঞ্জস্য করে না এবং -nএবং অন্যান্য বিকল্পগুলি পরিচালনা করে তবে এটি অনিশ্চিত। আপনি করতে পারেন:

shopt -s xpg_echo
echo hey\\nthere

hey
there

এবং এমনকি এটি প্রয়োজনীয় নয় যদি bashবিল্ড-টাইম বিকল্পের সাথে নির্মিত হয় ...

--enable-xpg-echo-default

করুন echobuiltin ডিফল্টরূপে ব্যাকস্ল্যাশ-পলান অক্ষর প্রসারিত করবে, প্রয়োজন ছাড়া -eবিকল্প। এই সেট ডিফল্ট মান xpg_echoথেকে শেল বিকল্প on, যা ব্যাশ তোলে echoআরো সংস্করণ একক ইউনিক্স স্পেসিফিকেশন উল্লেখিত, সংস্করণ 3. দেখুন মত আচরণ ব্যাশ Builtins , পালাবার ক্রম যে বর্ণনার জন্য echoস্বীকার করে।


printf


অন্যদিকে, printfআচরণের তুলনায় তুলনামূলকভাবে বেশ কার্যকর।

যুক্তিসহ ব্যাখ্যা

printfউপযোগ ঐতিহাসিকভাবে দ্বারা উপলব্ধ করা হয়েছে কার্যকারিতা প্রদান যোগ করা হয়েছিল echo। তবে, প্রচলিত বিভিন্ন সংস্করণে অপরিবর্তনীয় পার্থক্যের কারণে echoসংস্করণটির কয়েকটি বিশেষ বৈশিষ্ট্য রয়েছে printfযা সেটিকে নতুন এই ইউটিলিটিতে রেখে যায় , যা নবম সংস্করণ সিস্টেমে একটির উপর নির্ভরশীল।

এক্সটেন্ডেড বর্ণনার বিভাগটি printf()আইএসও সি স্ট্যান্ডার্ডে ফাংশনটির সাথে প্রায় হুবহু মিলে যায় , যদিও এটি এক্সবিডি ফাইল ফর্ম্যাট নোটেশনে ফাইল ফর্ম্যাট নোটেশনের ক্ষেত্রে বর্ণিত হয়েছে ।

এটি ফর্ম্যাট স্ট্রিংগুলি পরিচালনা করে যা এর আর্গুমেন্টগুলি বর্ণনা করে - যা কোনও সংখ্যক জিনিস হতে পারে তবে স্ট্রিংগুলির জন্য %byte স্ট্রিং বা আক্ষরিক %sট্রিংগুলি বেশ সুন্দর । %fপ্রথম আর্গুমেন্টের বিন্যাসগুলি ব্যতীত , এটি বেশিরভাগ %bইটি স্ট্রিং আর্গুমেন্টের মতো আচরণ করে , ব্যতীত এটি \cপালানোর বিষয়টি পরিচালনা করে না।

printf ^%b%s$ '\n' '\n' '\t' '\t'

^
\n$^    \t$

দেখুন কেন এর printfচেয়ে ভাল echo? আরো বেশী.


echo() printf


আপনি নিজের মান echoমত লেখে ...

echo(){
    printf '%b ' "$@\n\c"
}

... যা সবসময় সঠিকভাবে স্বয়ংক্রিয়ভাবে করা উচিত।

প্রকৃতপক্ষে, না ... \nএটি শেষ যুক্তিটি যদি একটি বিজোড় সংখ্যায় <ব্যাকস্ল্যাশেস> এ শেষ হয় তবে আর্গুমেন্টগুলির লেজে একটি আক্ষরিক প্রিন্ট করে ।

তবে এটি করে না:

echo()
    case    ${IFS- } in
    (\ *)   printf  %b\\n "$*";;
    (*)     IFS=\ $IFS
            printf  %b\\n "$*"
            IFS=${IFS#?}
    esac

ডিফল্টরূপে ব্যবহারের shopt -s xpg_echoবিকল্পটির জন্য +1 । echo-e
বিগনেশ রাজা

এই সমাধানটি ছাড়া কাজ করে না -e। আমি অবাক হয়েছি যে কেউই খেয়াল করেন নি যে সম্ভবত @ হাইডেস্চিফ
ha9u63ar

@ ha9u63ar - আহ ... তুমি কি এটা পড়েছ?
মাইকজার্ভ

27

"\ R \ n" এর মতো পালানো অক্ষরকে পার্স করতে এ-ই পতাকাটি প্রতিধ্বনিত করতে পাস করুন:

echo -e "Line 1\r\nLine2" >> readme.txt

কাজ থেকে বাঁচার ক্রমগুলি পাওয়ার জন্য একটি দুর্দান্ত সাধারণ "-e" বিকল্প - এটি অন্য উত্তরে বলেছে echoযা অবিশ্বাস্য এবং মানদণ্ডের বিপরীতে চলে না printf
এডওয়ার্ড

1
নিশ্চিত হয়ে নিন যে আপনার স্ক্রিপ্টে কোনও আক্ষরিক \ r \ n নেই, যেমন কোনও tr -d "\n"আদেশে in
Noumenon

8

আমি ব্যবহৃত ব্যাশের সমস্ত সংস্করণগুলিতে, আপনি কেবল ইন্টারেক্টিভ বা স্ক্রিপ্টে একটি স্ট্রিংয়ে আক্ষরিক নিউলাইন সন্নিবেশ করিয়ে দিতে পারেন, তবে স্ট্রিংটি পর্যাপ্ত পরিমাণে উদ্ধৃত হয়েছে।

ইন্টারেক্টিভ:

$ echo "Line one
> Line two"
Line one
Line two
$

একটি স্ক্রিপ্টে:

echo "Line one
Line two"

4
echo -e "Line 1\r\nLine2" >> readme.txt

আরও ব্যবহারের সম্ভাবনা:

man echo

2

লোকেরা ইতিমধ্যে পর্যাপ্ত উত্তর দিয়েছে, তবে আমি এমন একটি পৃথিবী গ্রহণ করতে অস্বীকার করি যেখানে প্রতিধ্বনি ব্যতীত অন্য কোনও বিকল্প গ্রহণ করে -n

nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3

1

আপনার যদি এমন কোনও চরিত্র থাকে যা বার্তার অংশ না হয় তবে আপনি সেড দিয়ে পাইপ করতে পারেন

$ echo "Time on the next line:@$(date +"%Y-%m-%dT%T%z")" | sed -e's/@/\n/g'
Time on the next line:
2016-03-25T10:12:39-0500
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.