বাশে একটি মাল্টলাইন স্ট্রিং আউটপুট কিভাবে?


250

আমি এরকম একাধিক প্রতিধ্বনি কলগুলি ব্যবহার না করে কীভাবে ব্যাশে মাল্টিপলাইন স্ট্রিং আউটপুট করতে পারি:

echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo 
echo "Report bugs to: "
echo "up home page: "

আমি এটি করার জন্য একটি বহনযোগ্য উপায় সন্ধান করছি, কেবল বাশ বিল্টইন ব্যবহার করে।


4
যদি আপনি কোনও ভুল দাওয়ার প্রতিক্রিয়া হিসাবে কোনও ব্যবহার বার্তা আউটপুট করে থাকেন তবে আপনি সাধারণত সেই বার্তাটি স্ট্যান্ডার্ড আউটপুটের পরিবর্তে স্ট্যান্ডার্ড ত্রুটিতে প্রেরণ করবেন,echo >&2 ...
মার্ক রিড

2
@ মার্কারইড ব্যবহার বার্তাটি টাইপ করে আউটপুট হয় --help(যা স্ট্যান্ডার্ডে যেতে হবে)।
হেল্পর্মোথড

অন্যদের সাথে যারা আসে, তাদের জন্য "এখানে দলিলগুলি" সম্পর্কে আরও তথ্য পাওয়া যায়: tldp.org/LDP/abs/html/here-docs.html
জেফ্রি মার্টিনেজ

printfগর্ডন ডেভিডসনের কাছ থেকে ভিত্তিক সমাধানটি পরীক্ষা করে দেখুন । echoবা catভিত্তিক পদ্ধতির ছায়ায় থাকা সত্ত্বেও , এটি একটি ক্লেজ থেকে অনেক কম বলে মনে হচ্ছে। স্বীকার করে নিন যে 'প্রিন্টফ' সিনট্যাক্সটি কিছুটা শেখার বক্ররেখার প্রতিনিধিত্ব করে, তবে আমি অন্যান্য ত্রুটিগুলি শুনতে চাই? (সামঞ্জস্যতা, পারফরম্যান্স? ...)
এমজেভি

উত্তর:


296

এখানে নথিগুলি প্রায়শই এই উদ্দেশ্যে ব্যবহৃত হয়।

cat << EOF
usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to: 
up home page:
EOF

এগুলি বাশনের সমস্ত সংস্করণ সহ সমস্ত বোর্ন-উত্পন্ন শেলগুলিতে সমর্থিত।


4
হ্যাঁ - তবে catএটি অন্তর্নির্মিত নয়।
মার্ক রিড

8
@ মার্করিড: এটি সত্য, তবে এটি সর্বদা উপলব্ধ (সম্ভবত অস্বাভাবিক পরিস্থিতিতে বাদে)।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

6
+1 থেক্স read -d '' help <<- EOF ...মাল্টিলাইন স্ট্রিংটি ভেরিয়েবলের মধ্যে পড়ে আমি শেষ করেছি এবং ফলাফলটি প্রতিধ্বনিত করেছি।
হেল্পারমোথড

3
আমি কি কোনও ভেরিয়েবলের একটি হারডোক সংরক্ষণ করতে পারি?
chovy

177

অথবা আপনি এটি করতে পারেন:

echo "usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to: 
up home page: "

1
@OliverWeiler: এটা এমন ধরনের ড্যাশ এবং বোর্ন শাঁস কাজ করবে heirloom বোর্ন শেল
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

6
আপনার যদি কোনও ফাংশনে এটি প্রয়োজন হয় তা দুর্দান্ত না কারণ আপনার ফাইলের বাম দিকে সমস্ত অংশটি বাইরে বেরিয়ে যেতে হবে) 2) আপনার বাকী কোডের সাথে লাইন রাখতে ইন্টেন্টেড রাখতে হবে তবে তারপরে এটি মুদ্রণ করে ইনডেন্টগুলি পাশাপাশি
এসজি

43

এই পৃষ্ঠায় অন্তর্দৃষ্টিপূর্ণ উত্তরগুলি দ্বারা অনুপ্রাণিত হয়ে আমি একটি মিশ্র পন্থা তৈরি করেছি, যা আমি সবচেয়ে সহজ এবং আরও নমনীয় মনে করি। আপনি কি মনে করেন?

প্রথমত, আমি ব্যবহারটি একটি চলকতে সংজ্ঞায়িত করি, যা আমাকে এটি বিভিন্ন প্রসঙ্গে পুনরায় ব্যবহার করতে দেয়। বিন্যাসটি খুব সাধারণ, প্রায় WYSIWYG, কোনও নিয়ন্ত্রণের অক্ষর যুক্ত করার প্রয়োজন ছাড়াই। এটি আমার কাছে যুক্তিসঙ্গতভাবে বহনযোগ্য বলে মনে হচ্ছে (আমি এটি ম্যাকওএস এবং উবুন্টুতে চালিয়েছি)

__usage="
Usage: $(basename $0) [OPTIONS]

Options:
  -l, --level <n>              Something something something level
  -n, --nnnnn <levels>         Something something something n
  -h, --help                   Something something something help
  -v, --version                Something something something version
"

তারপরে আমি কেবল এটি হিসাবে ব্যবহার করতে পারি

echo "$__usage"

বা আরও ভাল, প্যারামিটারগুলি পার্স করার সময়, আমি এটি কেবল সেখানে ওয়ান-লাইনারে প্রতিধ্বনি করতে পারি:

levelN=${2:?"--level: n is required!""${__usage}"}

4
এটি আমার জন্য এমন স্ক্রিপ্টে কাজ করেছে যেখানে উপরের উত্তরটি (পরিবর্তন ছাড়াই) দেয় না।
ডেভিড ওয়েলচ

3
এটি \ t এবং \ n এর মতো একগুচ্ছ চরিত্রের সাথে জড়িত থাকার চেয়ে ক্লিনার, যা লিখিত ক্ষেত্রে স্ট্রিংয়ের চেয়ে আউটপুটটিকে অনেক আলাদা করতে পাঠ্যটি খুঁজে পাওয়া এবং প্রসারিত করা শক্ত
সাক

1
কিছু কারণে এটি আমার জন্য একই লাইনে সবকিছু মুদ্রণ করে: /
নিকোলাস ডি ফন্টেনা

2
@ নিকোলাস: ডাবল কোট echo "$__usage"ব্যবহার করা আমার জন্য প্রয়োজনীয় ছিল। echo $__usageএটা কাজ করছে না.
মারিও

24

-eবিকল্পটি ব্যবহার করুন , তারপরে আপনি \nস্ট্রিং সহ নতুন লাইন চরিত্রটি মুদ্রণ করতে পারবেন ।

নমুনা (তবে একটি ভাল কিনা তা নিশ্চিত নয়)

মজার বিষয় হ'ল -eবিকল্পটি ম্যাকস এর ম্যান পৃষ্ঠাতে নথিভুক্ত করা হয়নি যখন এখনও ব্যবহারযোগ্য। এটি লিনাক্সের ম্যান পৃষ্ঠাতে নথিভুক্ত করা হয়েছে ।


6
এই ম্যান পেজগুলি সিস্টেম সরবরাহিত echoকমান্ডের জন্য /bin/echo, যা ম্যাক ওএসে কোনও -eবিকল্প নেই। আপনি যখন এই সিস্টেমে ব্যাশ ব্যবহার করছেন তখন এর অন্তর্নির্মিত echoকমান্ডটি গ্রহণ করবে। আপনি স্পষ্টভাবে টাইপ করে /bin/echo whateverএবং আচরণের পার্থক্য পর্যবেক্ষণ করে এটি দেখতে পারেন । অন্তর্নির্মিত জন্য ডকুমেন্টেশন দেখতে টাইপ করুন help echo
মার্ক রিড

1
/bin/echoপ্রায়শই একটি ওএস থেকে অন্য OS এবং বাশের অন্তর্নির্মিত থেকে পৃথক echo
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ মার্করিড: আমি পরে চেষ্টা করব, তবে তথ্যের জন্য ধন্যবাদ। +1 টি। আমি আমার উত্তরটি এখানেই রেখে দেব, যেহেতু বেশ ভাল আলোচনা চলছে।
নাহধঃ

7
echo -eবহনযোগ্য নয় - উদাহরণস্বরূপ, প্রতিধ্বনি কিছু বাস্তবায়ন আউটপুট অংশ হিসাবে "-e" মুদ্রণ করবে। আপনি যদি পোর্টেবিলিটি চান তবে তার পরিবর্তে প্রিন্টফ ব্যবহার করুন। উদাহরণস্বরূপ, ওএস এক্স 10.7.4 এ / বিন / প্রতিধ্বনি এটি করে। আইআইআরসি বাশ অন্তর্নির্মিত প্রতিধ্বনি 10.5.0 এর নিচেও অদ্ভুত ছিল তবে আমি আর বিশদটি মনে করি না।
গর্ডন ডেভিসন

2
echo -eআমাকে আগে দংশন করেছে ... অবশ্যই ব্যবহার করুন printfবা catএকটি হেরডোক দিয়ে। <<-এখান থেকে বৈকল্পিক ডক্স বিশেষত চমৎকার কারণ আপনার আউটপুটে নেতৃস্থানীয় খাঁজ স্ট্রিপ করতে হয়, কিন্তু স্ক্রিপ্টের মধ্যে পাঠযোগ্যতা জন্য ইন্ডেন্ট
zbeekman

22

যেহেতু আমি printfএকটি মন্তব্যে সুপারিশ করেছি , আমার সম্ভবত এটির ব্যবহারের কয়েকটি উদাহরণ দেওয়া উচিত (যদিও ব্যবহারের বার্তা প্রিন্ট করার জন্য, আমি ডেনিস 'বা ক্রিসের উত্তরগুলি ব্যবহার করার সম্ভাবনা বেশি করব)। printfতুলনায় কিছুটা জটিল echo। এটির প্রথম আর্গুমেন্টটি একটি ফর্ম্যাট স্ট্রিং, যাতে পলায়ন (লাইক \n) সর্বদা ব্যাখ্যা করা হয়; এটিতে বিন্যাসের দিকনির্দেশগুলিও অন্তর্ভুক্ত থাকতে পারে %, এতে কোন অতিরিক্ত যুক্তি কোথায় এবং কীভাবে অন্তর্ভুক্ত রয়েছে তা নিয়ন্ত্রণ করে। এটি ব্যবহারের বার্তার জন্য এটির ব্যবহারের জন্য দুটি ভিন্ন পদ্ধতি রয়েছে:

প্রথমত, আপনি পুরো বার্তাটি ফর্ম্যাট স্ট্রিংয়ে অন্তর্ভুক্ত করতে পারেন:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n"

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

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage"

দ্বিতীয়ত, আপনি প্রতিটি অতিরিক্ত যুক্তিকে আলাদা লাইনে মুদ্রণ করতে কেবল ফর্ম্যাট স্ট্রিংটি ব্যবহার করতে পারেন:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: " "up home page: "

এই বিকল্পের সাহায্যে বাগেরপোর্ট এবং হোমপেজের ঠিকানাগুলি যুক্ত করা মোটামুটি সুস্পষ্ট:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage"

9

এছাড়াও ইন্টেন্টেড সোর্স কোড সহ আপনি <<-নেতৃস্থানীয় ট্যাবগুলিকে অগ্রাহ্য করতে (পিছনে স্থান নয়) ব্যবহার করতে পারেন । উদাহরণস্বরূপ:

if [ some test ]; then
    cat <<- xx
        line1
        line2
xx
fi

শীর্ষস্থানীয় শ্বেতস্থান ছাড়া আউটপুট ইনডেন্ট করা পাঠ্য:

line1
line2

এটি আমার পক্ষে কার্যকর হয়নি। আপনি কোন শেল ব্যবহার করছেন?
চারটি

উবুন্টুতে 4.4.19 বাশে কাজ করেননি। এটি লাইন 1 এবং লাইন 2 এর আগে ফাঁকা স্থানটি সরিয়ে ফেলেনি
চারটি

1
@ ৪৪৩৩, তুমি ঠিকই বলেছিলে নেতৃস্থানীয় স্থানগুলি সরাতে কাজ করে না। তবে, নেতৃস্থানীয় ট্যাবগুলি সরিয়ে দেয়। সুতরাং আমি আমার উত্তরটি ট্যাব এবং স্পেসগুলি থেকে, ফাঁকা জায়গায় নয় ট্যাবগুলিতে সংশোধন করেছি। ভুলের জন্য দুঃখিত. আমি ম্যানুয়ালটি পরীক্ষা করেছিলাম এবং এটি পরিষ্কারভাবে বলেছে যে ট্যাবগুলি সরানো হয়েছে। এটা আমার নজরে আনার জন্য ধন্যবাদ।
উপবৃত্তাকার দর্শন

0

আপনি যদি @ জর্জে থেকে সমাধানটি ব্যবহার করেন এবং দেখতে পান যে সবকিছু একই লাইনে রয়েছে, আপনি নিশ্চিত করুন যে আপনি ভেরিয়েবলটি উদ্ধৃতিতে আবদ্ধ করেছেন:

echo $__usage

এক লাইনে সবকিছু মুদ্রণ করবে

echo "$__usage"

নতুন লাইন ধরে রাখতে হবে।


এটি আসলে আমার জন্য কাজ করে এমন একটি সমাধান। প্রিন্টফ অনেকগুলি কাজ করে এবং আমার মাল্টলাইন এক্সএমএল সহ এটির জন্য সম্ভবত প্রচুর পালানোর দরকার হয় কারণ এটি সামগ্রীতে সামগ্রিকভাবে ম্যাঙ্গাল করে। আমি foo = cat <<EOF .... EOF&& এর প্রতিধ্বনি "$ foo"
জিলিস ভ্যান গুরুপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.