ধারাবাহিকতা অক্ষরের পরে মন্তব্য সহ মাল্টি লাইন কমান্ড বাশ


29

বিবেচনা

echo \ # this is a comment
foo

এটি দেয়:

$ sh foo.sh
 # this is a comment
foo.sh: line 2: foo: command not found

ওয়েবে কিছু অনুসন্ধানের পরে, আমি বোন সাইটের স্ট্যাক ওভারফ্লোতে ডিজিটালরোস দ্বারা একটি সমাধান পেয়েছি । সুতরাং এক করতে পারেন

echo `: this is a comment` \
foo

বা বিকল্পভাবে

echo $(: this is a comment) \
foo

তবে এই সমাধানগুলি কেন কাজ করে তা ডিজিটালরোস ব্যাখ্যা করেনি। আমি একটি ব্যাখ্যা প্রশংসা করব। তিনি একটি মন্তব্যে জবাব দিলেন:

এখানে শেল gotoকমান্ড ব্যবহার করা হত যা :এখানে নির্দিষ্ট লেবেলে নির্দিষ্ট করা হয়েছে। gotoচলে গেছে কিন্তু আপনি এখনও ব্যবহার করতে পারেন : whateverসিনট্যাক্স ... :এখন পার্স মন্তব্য কেমন হয়।

তবে আমি বহনযোগ্যতার আলোচনা সহ আরও বিশদ এবং প্রসঙ্গ চাই।

অবশ্যই, কারও যদি অন্য সমাধান থাকে তবে তাও ভাল।

আগের প্রশ্নটিও দেখুন শেল স্ক্রিপ্টগুলিতে মাল্টি-লাইন কমান্ডগুলি কীভাবে মন্তব্য করবেন?


নীচের আলোচনা থেকে হোম বার্তা নিন। `: this is a comment`মাত্র একটি কমান্ড প্রতিস্থাপন করা হয়। আউটপুট : this is a commentকিছুই হয় না, এবং এটি জায়গায় স্থাপন করা হয় `: this is a comment`

আরও ভাল পছন্দ নিম্নলিখিত:

echo `# this is a comment` \
foo

উত্তর:


25

ধারাবাহিকতা রেখাগুলি ছাড়াই মন্তব্যগুলি প্রথম নতুন লাইনে শেষ হয় ( শেল টোকেন স্বীকৃতি নিয়ম 10 দেখুন ) , সুতরাং এই কোডটির একটি পৃথক কমান্ড লাইনে রয়েছে:foo

echo # this is a comment \
foo

আপনার প্রথম প্রস্তাব হিসাবে, ব্যাকস্ল্যাশ একটি নতুন লাইন অনুসরণ করে না, আপনি কেবল স্থানটি উদ্ধৃত করছেন: এটি সমান

echo ' # this is a comment'
foo

$(: this is a comment)কমান্ডের আউটপুট প্রতিস্থাপন করে : this is a comment। যদি সেই কমান্ডের আউটপুট খালি থাকে, তবে এটি একটি লাইনের মাঝখানে মন্তব্য inোকানোর জন্য কার্যকরভাবে একটি বিভ্রান্তিকর উপায়।

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

# Sample code to compress files that don't look compressed
case "$1" in
  *.gz|*.tgz|*.bz2|*.zip|*.jar|*.od?) :;; # the file is already compressed
  *) bzip2 -9 "$1";;
esac

অন্য ব্যবহারের ক্ষেত্রে হ'ল ভেরিয়েবল সেট করার জন্য একটি আইডিয়াম, যদি এটি ইতিমধ্যে সেট না করা থাকে।

: "${foo:=default value}"

গোটো সম্পর্কে মন্তব্যটি একটি historicalতিহাসিক। বোর্ন শেলের আগেও কোলন ইউটিলিটি ফিরে এসেছিল , থম্পসন শেলের সমস্ত পথ , যেখানে গোটো নির্দেশ ছিল। কোলন তখন একটি লেবেল বোঝায়; কোলন হ'ল গোটো লেবেলের জন্য মোটামুটি সাধারণ বাক্য গঠন (এটি এখনও সেডে উপস্থিত রয়েছে )।


আচ্ছা আমি দেখি. আপনি অবগত যে এই প্রসঙ্গে মন্তব্য tingোকানোর আরও ভাল কোন উপায় আছে?
ফাহিম মিঠা

3
@ ফাহিমমিঠা আপনার সূচিত থ্রেডে যেমন প্রস্তাবিত: আপনার আদেশটি পরিচালনাযোগ্য অংশগুলিতে ভেঙে দিন এবং প্রতিটি অংশকে মন্তব্য করুন। আপনার কমান্ডটি যদি মাঝখানে কোনও মন্তব্যের প্রয়োজন হিসাবে এত জটিল হয় তবে এটি সহজ করার সময় এসেছে!
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
ঠিক আছে, প্রশ্নে থাকা কমান্ডটিতে অনেক যুক্তি রয়েছে ... এটি একগুচ্ছ ভিডিও ফাইলকে একটি ফাইলে রূপান্তর করছে। আমি এটিকে সরল করার সরাসরি উপায় দেখছি না। হয়তো কিছু সাজানোর একটি তালিকা তৈরি করুন, এবং এটি একটি তর্ক হিসাবে পাস? আমার ধারণা এটি অন্য প্রশ্ন হতে পারে।
ফাহিম মিঠা

@ ফাহিমমিঠ উদাহরণ:, make_FINDএকটি কুইকি স্ক্রিপ্ট যা যুক্তিগুলির দীর্ঘ তালিকা তৈরি করে find। এখানে খণ্ড দ্বারা এটিকে তৈরি করার অনুপ্রেরণা হ'ল প্রতিটি অংশটি একটি লুপের শরীর থেকে আসে তবে একই স্টাইলটি প্রতিটি অংশে মন্তব্য করতে দেয়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
উদাহরণের জন্য ধন্যবাদ। আমার উদাহরণটি মূলত একটি আদেশের আর্গুমেন্ট হিসাবে দেওয়া নামের দীর্ঘ তালিকা। আমি প্রতিটি নামের সাথে মন্তব্য যুক্ত করতে চাই, কারণ এটি আমার পক্ষে প্রসঙ্গে রাখার সবচেয়ে সহজ উপায়। কমান্ডটি টুকরো টুকরো করার কোনও সুস্পষ্ট উপায় আমি দেখতে পাচ্ছি না এবং যদি আমি এটি করি তবে এটি এটি আরও দীর্ঘ করতে পারে এবং এটি ইতিমধ্যে যথেষ্ট দীর্ঘ।
ফাহিম মিঠা

6

আপনি এটি বাশ অ্যারে ব্যবহার করে অর্জন করতে পারেন, যেমন

#!/bin/bash
CMD=(
  echo  # this is a comment
  foo
  )

"${CMD[@]}"

এটি একটি অ্যারের সংজ্ঞা দেয় $CMDএবং তারপরে এটি প্রসারিত করে। একবার প্রসারিত ফলাফল লাইন মূল্যায়ন করা হয়, তাই এই ক্ষেত্রে echo fooকার্যকর করা হয়।

অ্যারেটির মধ্যে (এবং পাঠ্যটি )সংজ্ঞায়িত করে এবং সাধারণ বাশ সিনট্যাক্সের সাপেক্ষে তাই লাইনটিতে থাকা সমস্ত #কিছু উপেক্ষা করা হয়।

উদ্ধৃত হোয়াইটস্পেস সংরক্ষণ সম্পর্কে নোট

${CMD[@]}একটি একক স্ট্রিংয়ে প্রসারিত হয় যা স্থান দ্বারা পৃথক সমস্ত উপাদানগুলির সংমিশ্রণ। একবার প্রসারিত হয়ে গেলে বাশ তারপরে স্ট্রিংটিকে টোকেনগুলিতে স্বাভাবিক পদ্ধতিতে (সিএফ $ আইএফএস ) পার্স করবে , যা প্রায়শই আমরা চাই না is

বিপরীতে যদি প্রসারণটি ডাবল উদ্ধৃতিতে আবৃত হয়, অর্থাৎ "${CMD[@]}"অ্যারের প্রতিটি উপাদান সংরক্ষণ করা হয়। hello world second itemএবং মধ্যে পার্থক্য বিবেচনা করুন "hello world" "second item"

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

# LIST=("hello world" "second item")

# for ITEM in ${LIST[@]}; do echo $ITEM; done
hello
world
second
item

# for ITEM in "${LIST[@]}"; do echo $ITEM; done
hello world
second item

উত্তরের জন্য আপনাকে ধন্যবাদ, রবএম। সুতরাং, আপনার পরামর্শটি বাশ অ্যারে নিজেই তালিকায় থাকা আইটেমগুলি সম্পর্কে মন্তব্য / মেটা-তথ্য অন্তর্ভুক্ত করবেন? এই প্রশ্নটি সম্ভবত আরও কার্যকর হবে যদি আমি যে ধরণের কমান্ড ব্যবহার করার চেষ্টা করছিলাম তার উদাহরণ অন্তর্ভুক্ত করে থাকি। আমি কেন জানি না।
ফাহিম মিঠা

বাহ, দেখা যাচ্ছে আমি আপনার প্রশ্নটি মনোযোগ দিয়ে পড়িনি didn't ভেবেছিলেন যে আপনি যে প্রশ্নটির সাথে যুক্ত ছিলেন জিজ্ঞাসা করছেন। উফ। :)
রবএম

${CMD[@]}একটি প্রসারিত নেই একক পংক্তি। - এটি অনেকগুলি স্ট্রিংয়ে প্রসারিত: অ্যারের প্রতিটি উপাদানগুলির জন্য কেবল বিভক্ত নয়, প্রতিটি উপাদানের শ্বেত স্পেসেও। (অর্থাৎ: সম্পূর্ণরূপে অকেজো)
রবার্ট সিমার

4

করবেন না $(: comment)। এটি কোনও মন্তব্য নয় - এটি একটি সাবশেল - বেশিরভাগ শেলের জন্য আরও একটি নতুন নতুন শেল প্রক্রিয়া। আপনার লক্ষ্যটি কম ডাব্লু / আপনার ইনপুট করা, বেশি নয় যা এটি যা করবে - তা অর্থহীন হলেও।

পরিবর্তে আপনি এটি করতে পারেন ...

printf '<%s>\n' some args here ${-##*"${--

                my long comment block

                }"}  and "more ${-##*"${--

                and another one in the
                middle of the quoted string
                there shouldn\'t b\e any special &
                (character) `echo issues here i hope >&2`
                basically anything that isn\'t a close \}
                $(echo the shell is looking for one >&2)
                }$(echo "}'"\" need backslash escaping >&2
                                )${-##*${--

                nesting is cool though

             }}"}here too"

}'" need backslash escaping
<some>
<args>
<here>
<and>
<more here too>

মূলত সেখানে কী হচ্ছে শেলটি একটি প্রতিস্থাপন করছে। এটি $-প্রতিবার দুবার বিশেষ শেল প্যারামিটারের মান প্রতিস্থাপন করে । এটি যাইহোক যাইহোক একটি ছোট স্ট্রিং, তবে এটি সর্বদা সেট করা থাকে - এবং তাই অভ্যন্তরীণ প্রতিস্থাপন - যা বাইরের দিক থেকে ফালা ফেলার ধরণ হিসাবে ব্যাখ্যা করা হয় - যখন আমি প্রসারিত ফর্মটি ব্যবহার করি তখন বন্ধনীগুলির মধ্যে থাকা সামগ্রীতে প্রসারিত হয় না-

এখানে:

bash -x <<""
printf %s\\n '${-##*"'${-- a set param doesn\'t expand to this optional text }'"}'

+ printf '%s\n' '${-##*"hxB"}'
${-##*"hxB"}

দেখুন? সুতরাং এটি মাত্র দু'বার প্রসারিত। শীঘ্রই শেলটি খুঁজে পাওয়ার সাথে সাথে প্যারামিটারটি সেট করা হয় alচ্ছিক প্রসারিত ক্ষেত্রের সমস্ত কিছু ফেলে দেওয়া হয়, বেশ কিছু পরিমাণে, এবং এটি তার পুরো মানটিতে প্রসারিত হয় যা নিজের থেকে সরানো হয় এবং তাই কিছুই হয় না। বেশিরভাগ শেলগুলিতে আপনার এমনকি উদ্ধৃতিগুলি এড়ানো দরকার হয় না, তবে bashএটির প্রয়োজন হয়।

আরও ভাল হয়:

COMMENT=
echo      ${COMMENT-"
           this will work the same way
           but the stripping isn\'t
           necessary because, while
           the variable is set, it is also
           empty, and so it will expand to
           its value - which is nothing
           "} this you\'ll see

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