মাল্টিলাইন কমান্ডের ভিতরে বাশ স্ক্রিপ্টে মন্তব্য করা


164

আমি কোনও স্ক্রিপ্ট থেকে নিম্নলিখিত লাইনের প্রতিটি লাইনে কীভাবে মন্তব্য করব?

cat ${MYSQLDUMP} | \
sed '1d' | \
tr ",;" "\n" | \
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

যদি আমি চেষ্টা করে মন্তব্যটি যুক্ত করি তবে:

cat ${MYSQLDUMP} | \ # Output MYSQLDUMP File

আমি পাই:

#: not found

এখানে মন্তব্য করা সম্ভব?


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

উত্তর:


203

এতে কিছুটা ওভারহেড থাকবে তবে প্রযুক্তিগতভাবে এটি আপনার প্রশ্নের উত্তর দেয়:

echo abc `#Put your comment here` \
     def `#Another chance for a comment` \
     xyz, etc.

এবং বিশেষত পাইপলাইনগুলির জন্য, ওভারহেড ছাড়াই একটি পরিষ্কার সমাধান রয়েছে:

echo abc |        # Normal comment OK here
     tr a-z A-Z | # Another normal comment OK here
     sort |       # The pipelines are automatically continued
     uniq         # Final comment

মাল্টি-লাইন কমান্ডের জন্য লাইন মন্তব্য কীভাবে রাখবেন তা স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন ।


1
জটিল মনে হচ্ছে, সহজ পদ্ধতি না থাকলে?
বাসকোজ

1
ঠিক আছে, আমি কিছুটা সহজ প্রকরণ যুক্ত করেছি।
ডিজিটালরোস

1
ব্যাকস্ল্যাশ প্রয়োজন হয় না তা এই সত্যটি দেখানোর জন্য আপনি নিজের উত্তরটি পরিবর্তন করতে পারেন যাতে আমি প্রতিটি লাইনের পাশে মন্তব্যগুলি রাখতে পারি এবং কেবল একটি পাইপ ব্যবহার করতে পারি?
বাসকোজ

আমি যে সংস্করণ এক এবং দুটি কাজ যাচাই। যাইহোক, তারা ব্যাখ্যা করতে পারেন যে তারা কেন করে এবং এখানে কী চলছে? ধন্যবাদ।
ফাহিম মিঠা

1
ব্যাখ্যার জন্য ধন্যবাদ. আমি ইউনিক্স.এসএক্সে একটি প্রশ্ন খুলেছি আরও ধারাবাহিকতার চরিত্রের পরে মন্তব্যে মাল্টি লাইন কমান্ডের আরও বিশদ জানতে চাইছি ।
ফাহিম মিঠা

39

চলমান ব্যাকস্ল্যাশ অবশ্যই ধারাবাহিকতা কমান্ড হিসাবে ব্যাখ্যা করার জন্য লাইনের শেষ অক্ষর হতে হবে। এর পরে কোনও মন্তব্য বা এমনকি সাদা স্থানের অনুমতি নেই।

আপনার কমান্ডগুলির মধ্যে মন্তব্য লাইন রাখতে সক্ষম হওয়া উচিত

# output MYSQLDUMP file
cat ${MYSQLDUMP} | \
# simplify the line
sed '/created_at/d' | \
# create some newlines
tr ",;" "\n" | \
# use some sed magic
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
# more magic
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
# even more magic
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
# I hate phone numbers in my output
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \ 
# one more sed call and then send it to the CSV file
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

12
যখন পাইপলাইন কমান্ড উপাদানটি শেষ হয় তখন প্রয়োজনীয় হয় না
ডিজিটালরোস

2
ডিজিটালরোস, আপনি সঠিক, আমি কেবল পাইপ ব্যবহার করতে পারি ব্যাকস্ল্যাশ নয় এবং তারপরে আমার # মন্তব্যগুলি পুরোপুরি কার্যকর হবে ... আপনি কি উত্তর হিসাবে পোস্ট করতে পারেন যাতে আমি তা গ্রহণ করতে পারি?
বাসকোজ

8
"আপনার কমান্ডগুলির মধ্যে মন্তব্য লাইনগুলি রাখতে সক্ষম হওয়া উচিত": না, এটি কেবলমাত্র কাজ করছে কারণ পূর্ববর্তী লাইনের শেষ বর্ণিত চরিত্রটি |। আপনি যদি চেষ্টা করেন তবে cat file1\<newline>#comment<newline>file2দেখবেন আপনি পাবেন না cat file1 file2, বরং পাচ্ছেন cat file1; file2
সন্দেহভাজনজিম

5
তবে, অন্যরা যেমন বলেছে, ঠিকঠাক cat file1 | # comment<newline>sortকাজ করে। তাই হয় cat file1 && # comment<newline>echo foo। সুতরাং মন্তব্যগুলি |বা &&বা পরে অন্তর্ভুক্ত করা যেতে পারে ||তবে `\` বা কমান্ডের মাঝখানে নয়।
সন্দেহজনক জিম

7

ডিজিটালরোস যেমন উল্লেখ করেছে, লাইনটি জোরে শেষ হলে পিছনের পিছনে পিছনে পিছন দিকে যাওয়া দরকার |। এবং আপনি নিম্নলিখিতটি অনুসরণ করে একটি লাইনে মন্তব্য করতে পারেন |:

 cat ${MYSQLDUMP} |         # Output MYSQLDUMP file
 sed '1d' |                 # skip the top line
 tr ",;" "\n" | 
 sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' |
 sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' |
 sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' |
 tr "\n" "," |
 sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' |   # hate phone numbers
 sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

5

ব্যাকস্ল্যাশ # এড়িয়ে যায়, কমেন্টের চরিত্রের পরিবর্তে এটির আভিধানিক চরিত্র হিসাবে ব্যাখ্যা করে।


3

$IFS মন্তব্য হ্যাক

এই হ্যাকটি প্যারামিটার সম্প্রসারণ ব্যবহার করে $IFSযা কমান্ডগুলিতে শব্দ পৃথক করতে ব্যবহৃত হয়:

$ echo foo${IFS}bar
foo bar

একইভাবে:

$ echo foo${IFS#comment}bar
foo bar

এটি ব্যবহার করে, আপনি ধারাবাহিকতা সহ একটি কমান্ড লাইনে একটি মন্তব্য রাখতে পারেন:

$ echo foo${IFS# Comment here} \
> bar
foo bar

তবে মন্তব্যটির \ধারাবাহিকতার আগে হওয়া উচিত ।

নোট করুন যে প্যারামিটার সম্প্রসারণ মন্তব্যটির ভিতরে করা হয়:

$ ls file
ls: cannot access 'file': No such file or directory
$ echo foo${IFS# This command will create file: $(touch file)}bar
foo bar
$ ls file
file

বিরল ব্যতিক্রম

এই ব্যর্থ হওয়ার একমাত্র বিরল ক্ষেত্রে হ'ল যদি $IFSপূর্বে সম্প্রসারণের মাধ্যমে সরানো টেক্সটটি (যেমন, #চরিত্রের পরে ) দিয়ে শুরু করা হয়:

$ IFS=x
$ echo foo${IFS#y}bar
foo bar
$ echo foo${IFS#x}bar
foobar

নোট করুন ফাইনালের foobarকোনও স্থান নেই, ইস্যুটি চিত্রিত করে।

যেহেতু $IFSডিফল্টরূপে কেবল শ্বেত স্পেস রয়েছে তাই আপনি এই সমস্যার মধ্যে চলে যাবেন এমন সম্ভাবনা খুব কম।


@ Pjh এর মন্তব্যে ক্রেডিট যা এই উত্তরটির সূত্রপাত করেছিল।


1

ডিজিটালরোসের উদাহরণগুলির পাশাপাশি, এখানে আরও একটি ফর্ম যা আপনি $()ব্যাকটিক্সের পরিবর্তে পছন্দ করলে আপনি ব্যবহার করতে পারেন`

echo abc $(: comment) \
     def $(: comment) \
     xyz

অবশ্যই আপনি ব্যাকটিক্স সহ কোলন সিনট্যাক্সটিও ব্যবহার করতে পারেন:

echo abc `: comment` \
     def `: comment` \
     xyz

অতিরিক্ত নোট

কারণ $(#comment)কাজ কারণ একবার এটি দেখতে পাবে না না #, এটা বন্ধ প্রথম বন্ধনী সহ মন্তব্য, যেমন লাইন বাকি একইরূপে: comment)। সুতরাং বন্ধনী কখনই বন্ধ হয় না।

ব্যাকটিক্স পৃথকভাবে পার্স করে এবং ক্লোজিং ব্যাকটিকটি একটি পরেও সনাক্ত করে #


1
এটি কি প্রতিটি মন্তব্যের জন্য একটি নতুন শেল তৈরি করবে?
লনিক্স

0

এখানে একটি বাশ স্ক্রিপ্ট যা পূর্ববর্তী বেশ কয়েকটি মন্তব্যগুলির ধারণাগুলি এবং আইডিয়ামগুলিকে একত্রিত করে, উদাহরণ সহ, সাধারণ ফর্মযুক্ত ইনলাইন মন্তব্যগুলি ${__+ <comment text>}

নির্দিষ্টভাবে

  • <comment text> মাল্টি-লাইন হতে পারে
  • <comment text> প্যারামিটার-প্রসারিত নয়
  • কোনও উপ-প্রক্রিয়া তৈরি হয়নি (সুতরাং মন্তব্যগুলি দক্ষ)

<comment text>ভারসাম্যহীন ধনুর্বন্ধনী '}'এবং বন্ধনী ')'অবশ্যই সুরক্ষিত করতে হবে (যেমন, '\}'এবং '\)') one

স্থানীয় বাশ পরিবেশে একটি প্রয়োজনীয়তা রয়েছে:

  • প্যারামিটারের নামটি __অবশ্যই আনসেট করা উচিত

অন্য যে কোনও সিন্ট্যাক্টিক্যালি বৈধ বাশ প্যারামিটার-নামটি সেই জায়গায় প্রয়োগ করবে __, যদি শর্ত থাকে যে নামের কোনও সেট মান নেই।

একটি উদাহরণ স্ক্রিপ্ট অনুসরণ করে

# provide bash inline comments having the form
#     <code> ${__+ <comment>} <code> 
#     <code> ${__+ <multiline
#                   comment>} <code>

# utility routines that obviate "useless use of cat"
function bashcat { printf '%s\n' "$(</dev/stdin)"; }
function scat { 1>&2 bashcat; exit 1; }

# ensure that '__' is unset && remains unset
[[ -z ${__+x} ]] &&  # if '__' is unset
  declare -r __ ||   # then ensure that '__' remains unset 
  scat <<EOF         # else exit with an error
Error: the parameter __='${__}' is set, hence the
  comment-idiom '\${__+ <comment text>}' will fail
EOF

${__+ (example of inline comments)
------------------------------------------------
the following inline comment-idiom is supported
    <code> ${__+ <comment>} <code> 
    <code> ${__+ <multiline
                  comment>} <code> 
(advisory) the parameter '__' must NOT be set;
  even the null declaration __='' will fail
(advisory) protect unbalanced delimiters \} and \) 
(advisory) NO parameter-expansion of <comment> 
(advisory) NO subprocesses are spawned
(advisory) a functionally equivalent idiom is 
    <code> `# <comment>` <code> 
    <code> `# <multiline
               comment>` <code>
however each comment spawns a bash subprocess
that inelegantly requires ~1ms of computation 
------------------------------------------------}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.