প্রশ্ন একটি পরিবর্তনশীল জটিল মাল্টি লাইন স্ট্রিং লিখতে পরিষ্কার উপায়


আমি একটি bash স্ক্রিপ্ট ভিতরে একটি পরিবর্তনশীল কিছু জটিল XML লিখতে হবে। এক্সএমএলটি bash স্ক্রিপ্টের ভিতরে পাঠযোগ্য হতে হবে কারণ এইখানে এক্সএমএল ফ্র্যাগমেন্ট থাকবে, এটি অন্য কোনও ফাইল বা উৎস থেকে পড়তে হচ্ছে না।

তাই আমার প্রশ্নটি যদি আমার দীর্ঘ লম্বা স্ট্রিং থাকে তবে আমি আমার ব্যাশ স্ক্রিপ্টের ভিতরে মানুষের পাঠযোগ্য হতে চাই, এটি সম্পর্কে যাওয়ার সেরা উপায় কী?

আদর্শভাবে আমি চাই:

  • অক্ষর যে কেউ পালাতে হবে না
  • এটা মানুষের পঠনযোগ্য তৈরীর একাধিক লাইন জুড়ে বিরতি আছে
  • এটা indentation রাখা

এই ইওফ বা কিছু দিয়ে করা যাবে, কেউ আমাকে একটি উদাহরণ দিতে পারে?

উদাহরণস্বরূপ

String = <<EOF
 <?xml version="1.0" encoding='UTF-8'?>
 <painting>
   <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
   <caption>This is Raphael's "Foligno" Madonna, painted in
   <date>1511</date>-<date>1512</date>.</caption>
 </painting>
EOF

94
2017-10-08 10:54


উত্স


আমি যে আপনি শুধু একটি স্ট্রিম আবার তথ্য ডাম্প যাচ্ছেন বাজি করতে ইচ্ছুক। কেন আপনি আরও জটিল এবং স্ট্রিম ব্যবহার করতে পারে যখন একটি পরিবর্তনশীল এটি সংরক্ষণ করুন? - Zenexer
এই খুব দেখুন: অতিরিক্ত স্থান (সংরক্ষিত ইন্ডেন্টেশন) সঙ্গে মাল্টি লাইন স্ট্রিং - Yibo Yang


উত্তর:


এই উদ্ধৃতি অব্যাহতি ছাড়া আপনার পরিবর্তনশীল আপনার টেক্সট রাখবে। এটি অসম্পূর্ণ উদ্ধৃতিগুলি পরিচালনা করবে (এস্ট্রোফ্রেশস, অর্থাত্। ')। সেনিনেল (ইওএফ) এর চারপাশে উদ্ধৃতি উদ্ধৃতি পাঠ্য পরিমাপের চলমান থেকে পাঠ্যকে আটকায়। দ্য -d'' এটি একাধিক লাইন পড়া (newlines উপেক্ষা)। read একটি বাশ নির্মিত হয় তাই এটি যেমন বাহ্যিক কমান্ড কল করার প্রয়োজন হয় না cat

IFS='' read -r -d '' String <<"EOF"
<?xml version="1.0" encoding='UTF-8'?>
 <painting>
   <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
   <caption>This is Raphael's "Foligno" Madonna, painted in
   <date>1511</date>-<date>1512</date>.</caption>
 </painting>
EOF

123
2017-10-08 12:37



এড়ানো জন্য +1 cat। - James Sneeringer
cat একটি বাহ্যিক কমান্ড। এটি ব্যবহার করে না যে সংরক্ষণ করে। এছাড়াও, কিছু দর্শনের আছে যে যদি আপনি কম দুটি আর্গুমেন্টের সাথে বিড়ালটি ব্যবহার করেন তবে "উর ডিন" এটি ভুল "(যা" নির্লজ্জ ব্যবহার থেকে আলাদা " cat")। - Dennis Williamson
এবং কখনও কখনও দ্বিতীয় EOF indent .... (একসঙ্গে মাথা bangs একাধিক টেবিল) - IljaBek
আমি উপরের বিবৃতি ব্যবহার করার চেষ্টা করেছিলাম set -e। এটা দেখতে read সবসময় অ শূন্য ফিরে। আপনি ব্যবহার করে এই আচরণ পুরু করতে পারেন ! read -d ....... - krissi
এবং যদি আপনি এই মাল্টি লাইন ব্যবহার করা হয় String পরিবর্তনশীল একটি ফাইল লিখতে, ভেরিয়েবল প্রায় "QUOTES" মত রাখুন echo "${String}" > /tmp/multiline_file.txt অথবা echo "${String}" | tee /tmp/multiline_file.txt। যে খুঁজে বের করার জন্য আমাকে একটি ঘন্টা বেশি সময় লাগছিল। - Aditya


আপনি প্রায় সেখানে হয়েছে। আপনি ব্যবহার করেন বিড়াল আপনার স্ট্রিং এর সমাবেশের জন্য অথবা আপনি পুরো স্ট্রিংটি উদ্ধৃত করেছেন (এই ক্ষেত্রে আপনার স্ট্রিংয়ের ভিতরে উদ্ধৃতিগুলি পালাতে হবে):

#!/bin/sh
VAR1=$(cat <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
  <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
  <caption>This is Raphael's "Foligno" Madonna, painted in
  <date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
)

VAR2="<?xml version=\"1.0\" encoding='UTF-8'?>
<painting>
  <img src=\"madonna.jpg\" alt='Foligno Madonna, by Raphael'/>
  <caption>This is Raphael's \"Foligno\" Madonna, painted in
  <date>1511</date>-<date>1512</date>.</caption>
</painting>"

echo "${VAR1}"
echo "${VAR2}"

25
2017-10-08 11:14



দুর্ভাগ্যবশত, "রাফায়েল এর" এ apostrophe প্রথম কাজ করে না। - Dennis Williamson
উভয় assignments অবশেষে আমার জন্য কাজ। VAR1 এ একক উদ্ধৃতি একটি সমস্যা হতে পারে না (কমপক্ষে ব্যাশের জন্য নয়)। হয়তো আপনি সিনট্যাক্স হাইলাইট দ্বারা বিভ্রান্ত করা হয়েছে? - joschi
এটি একটি স্ক্রিপ্টে কাজ করে, কিন্তু একটি বাশ প্রম্পটে নয়। পরিষ্কার হচ্ছে না জন্য দুঃখিত। - Dennis Williamson
এটা হিসাবে EOF উদ্ধৃত করা ভাল 'EOF' অথবা "EOF", অন্যথায় শেল ভেরিয়েবল পার্স করা হবে। - Stanislav German-Evtushenko


#!/bin/sh

VAR1=`cat <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
  <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
  <caption>This is Raphael's "Foligno" Madonna, painted in
  <date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
`
echo "VAR1: ${VAR1}"

এই বোর্ন শেল পরিবেশের মধ্যে সূক্ষ্ম কাজ করা উচিত


9
2017-09-05 15:54



+1 এই সমাধান পরিবর্তনশীল প্রতিস্থাপন অনুমতি দেয় $ {foo} - Offirmo
উল্টো: sh- সামঞ্জস্যপূর্ণ। ডাউনসাইড: ব্যাকটিক্সগুলি ব্যাশে অব্যক্ত / নিরুৎসাহিত। এখন যদি আমি sh এবং bash মধ্যে বেছে নিতাম ... - Zenexer
যেহেতু ব্যাক্টিক্স নিরস্ত / নিরুৎসাহিত হয়? উৎসুক - Alexander Mills


তবুও একই কাজ করার আরেকটি উপায় ...

আমি ভেরিয়েবল এবং বিশেষ ব্যবহার করতে চান <<- কে ড্রপ ছককাটা তালিকাভুক্ত করণ স্ক্রিপ্ট indentation অনুমতি প্রতিটি লাইন শুরুতে:

#!/bin/bash

mapfile Pattern <<-eof
        <?xml version="1.0" encoding='UTF-8'?>
        <painting>
          <img src="%s" alt='%s'/>
          <caption>%s, painted in
          <date>%s</date>-<date>%s</date>.</caption>
        </painting>
        eof

while IFS=";" read file alt caption start end ;do
    printf "${Pattern[*]}" "$file" "$alt" "$caption" "$start" "$end"
  done <<-eof
        madonna.jpg;Foligno Madonna, by Raphael;This is Raphael's "Foligno" Madonna;1511;1512
        eof

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

<?xml version="1.0" encoding='UTF-8'?>
 <painting>
   <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
   <caption>This is Raphael's "Foligno" Madonna, painted in
   <date>1511</date>-<date>1512</date>.</caption>
 </painting>
কিছু ব্যাখ্যা:
  • mapfile পুরো পড়া এখানে ডকুমেন্ট একটি অ্যারে।
  • সিনট্যাক্স "${Pattern[*]}" একটি স্ট্রিং মধ্যে এই অ্যারে নিক্ষেপ করবেন না।
  • আমি ব্যবহার করি IFS=";" কারণ নেই ; প্রয়োজনীয় স্ট্রিং
  • সিনট্যাক্স while IFS=";" read file ... প্রতিরোধ IFS স্ক্রিপ্ট বাকি জন্য সংশোধন করা হবে। এই, শুধুমাত্র read পরিবর্তিত ব্যবহার করবেন না IFS
  • কোন ফর্ক।

4
2017-07-22 13:45



মনে রাখবেন যে mapfile বাশ 4 বা উচ্চ প্রয়োজন। এবং সিনট্যাক্স "${Pattern[*]}" একটি স্ট্রিং মধ্যে অ্যারে বহন করে উদ্ধৃতি যখন (যেমন উদাহরণ কোড দেখানো)। - Dennis Williamson
হ্যাঁ, bash 4 খুব ছিল নতুন যখন এই প্রশ্ন জিজ্ঞাসা করা হয়। - F. Hauri


অন্যান্য উত্তর অনেক ক্ষেত্রে অনেক কোণ ক্ষেত্রে আছে।

স্পষ্টভাবে নিশ্চিত হবার জন্য স্পেস, ট্যাব, আইএফএস ইত্যাদির সাথে কোন সমস্যা নেই, "হেডডোক" গঠনটি ব্যবহার করা আরও ভাল পদ্ধতি, তবে হেডডোকের সামগ্রীগুলি এনকোড করে ব্যবহার করে uuencode এখানে ব্যাখ্যা করা হয়েছে:

https://stackoverflow.com/questions/6896025/#11379627


2
2018-05-17 09:10