আমি পাঁচটি গুণতে কীভাবে স্ক্রিপ্ট তৈরি করতে পারি?


10

আমি 375 এবং 3500 (375, 380, 385 ...) এর মধ্যে পাঁচটির গুণকগুলির সমস্ত তালিকাতে খুব সাধারণ বাশ স্ক্রিপ্ট তৈরি করার চেষ্টা করছিলাম। একটি জিনিস যা আমি চেষ্টা করেছিলাম এবং কাজ করে নি তা হ'ল:

for i in {375..3500}
do
        echo $i
        (($i += 5))
done

আমি কিছুক্ষণ পর ছেড়ে দিয়েছিলাম এবং প্রায় 15 সেকেন্ডের মধ্যে এটি বেসিক এ লিখেছি:

10 count = 375
20 print count
30 count = count+5
40 if count < 3500 then goto 20

আমি কীভাবে আমার বেসিক প্রোগ্রামটি ব্যাশ স্ক্রিপ্টে তৈরি করতে পারি?


এটি স্ট্যাক ওভারফ্লোতে আরও ভাল - ইউনিক্স এবং লিনাক্স ওএস সম্পর্কে, কোডিং নয়। কোডিং স্ট্যাকওভারফ্লোয়ের জন্য।
noɥʇʎԀʎzɐɹƆ

উত্তর:


20

বিকল্প হিসাবে লুপ জন্য একটি traditionalতিহ্যগত সি স্টাইল ব্যবহার করা যেতে পারে:

for ((i=375; i<=3500; i+=5)); do
    echo $i
done

এটি সম্ভবত সিক ব্যবহারের চেয়ে কম স্পষ্ট, তবে এটি কোনও উপ-প্রসেসগুলি স্প্যান করে না। যদিও আমি সি এর সাথে পরিচিত, আমার এটি বুঝতে কোনও অসুবিধা হবে না, তবে ওয়াইএমএমভি।


1
এই পদ্ধতির খারাপ দিকটি এটি কম পোর্টেবল। Seq পদ্ধতি POSIX sh এ কাজ করে।
ওয়াউটার ভারহেলস্ট

ওহ, লুপের জন্য সি-স্টাইল কি পসিক্স এস-তে নেই? আপনি প্রতিদিন নতুন কিছু শিখুন ...
মুজার

2
@ ওউটারভারহেলস্ট ওয়েল, আপনি যদি পসিএক্স শের মধ্যে সীমাবদ্ধ থাকেন তবে আপনি সম্ভবত সিক পাবেন না, যা জিএনইউ কোর্টিলসের অংশ। ব্যস্তবক্সের আরও সীমিত বাস্তবায়ন রয়েছে, তবে এর বাইরেও অনেক এমবেডেড সিস্টেম সম্ভবত এটি মোটেই থাকবে না।
ক্রিস ডাউন

1
@ মুজার - কমপক্ষে dashএটি সমর্থন করে না। @ ক্রিসডাউন - "পসিক্স শ" কে "নো সিক" বোঝানোর কোনও কারণ নেই। তবে হ্যাঁ, মঞ্জুর, আমি পোক্স দ্বারা সিক নির্দিষ্ট করা হয়নি তা উপেক্ষা করেছিলাম।
ওয়াউটার ভারহেলস্ট

27

যেহেতু আপনি যাইহোক ব্রেস প্রসারণ ব্যবহার করেন, তাই এর বৈশিষ্ট্যটি পুরোপুরি ব্যবহার করুন:

echo {375..3500..5}

আপনি এই কৌশলটি ব্যবহার করে বিকল্পের printfপরিবর্তে প্রতিটি সংখ্যা পৃথক লাইনে মুদ্রণ করতে ব্যবহার করতে পারেন echo, উদাহরণস্বরূপ:

$ printf "Number %s is generated.\n" {375..3500..5}
Number 375 is generated.
Number 380 is generated.
Number 385 is generated.
...

সম্পাদন করা

মন্তব্যে @ কোজিরো দ্বারা চিহ্নিত হিসাবে ম্যাক ওএস ব্যাশ 3 ডিফল্ট শেল হিসাবে ব্যবহার করে, যা ব্রেস সম্প্রসারণের ক্রম প্রকাশের ক্রমবর্ধমানকে সমর্থন করে না। আপনাকে বাশ সংস্করণ 4 এ আপগ্রেড করতে হবে বা এমন শেল ব্যবহার করা উচিত যা এটি সমর্থন করে (যেমন সাম্প্রতিক zsh)।


2
এটি ম্যাক ওএস 10.10.3 এ আমার জন্য কাজ করে না। এটি '{375..3500..5।' আউটপুট করে।
aswine

6
@ সোয়াইন তাই এজন্য আপনার জিজ্ঞাসা করার সময় আপনার ওএসের কথা সর্বদা উল্লেখ করা উচিত । বিশেষত যেহেতু ওএসএক্সের অন্যান্য ইউনিসিস এবং লিনাক্স থেকে অনেকগুলি পার্থক্য রয়েছে।
টেরডন

2
এটি প্রতি সেয়ে কোনও ওএস পার্থক্য নয়। এটি একটি সংস্করণ পার্থক্য। ওএস এক্সে কেবল BASH 3 OOTB রয়েছে। আপনি প্রায় কোনও ওএস এক্স প্যাকেজ ম্যানেজার ব্যবহার করে এই শতাব্দী থেকে একটি BASH ইনস্টল করতে পারেন। আমি একসাথে হোম ব্রিউ ব্যবহার করি।
কোজিরো

2
এই বিস্তৃতিটি সরাসরি চলতে ব্যর্থ হয় তবে bash -cদুটি গর্তের সাথে জড়িত থাকার গ্যারান্টি অনেকটা সফল হয় । $SHELL --versionএটি কি 3 বাশ বলে?
ধাগ

3
@ মিমকিজার উত্তরটি খুব সহজ - আমি এটি লিখিনি কারণ bashএই বৈশিষ্ট্যের কোন সংস্করণটি চালু হয়েছিল তা সম্পর্কে আমার কোনও ধারণা ছিল না । আমি নিজেই এটি কোজিরো মন্তব্য থেকে শিখেছি। এবং দয়া করে আমাকে এসসি এর সাথে তুলনা করবেন না, আমি সত্যই 1970 এর শেষের পরে থেকে সমস্ত শেলের সমস্ত বিবরণ এবং ইতিহাস জানি না।
জিম্মিজ

17

এসইকিউ ব্যবহার করে (1)

for i in $(seq 375 5 3500)
do
    echo $i
done

বা, সহজভাবে:

seq 375 5 3500

4
এমনকি লুপটি ড্রপ করে কেবল ব্যবহার করা সহজ হবে seq 375 5 3500
ধাগ

11

আপনার দুটি কারণে লুপ স্নিপেট যেমন প্রয়োজন তেমন কার্যকর হয়নি:

  • (($i += 5))- এখানে $iমানটির প্রসারিত হয় i। সুতরাং প্রসারণটি এমন কিছু হবে ((375 += 5)), যার কোনও অর্থ নেই (অন্য আক্ষরিক সংখ্যায় একটি আক্ষরিক সংখ্যা নির্ধারণের চেষ্টা করা)। এটি সাধারণত ((i += 5))( $ভেরিয়েবলটি প্রসারিত করার জন্য নয়) দিয়ে অর্জন করা হবে
  • {375..3500}লুপ প্রথম পুনরাবৃত্তির সামনে সম্প্রসারিত হবে। এটি সংখ্যার তালিকা হবে 375 376 ... 3499 3500। লুপের প্রতিটি পুনরাবৃত্তির জন্য i, এই প্রতিটি সংখ্যাকে একের পর এক নির্ধারিত হবে। সুতরাং প্রতিটি পুনরাবৃত্তির শুরুতে, iসেই তালিকার পরবর্তী মানটিতে পুনরায় স্বাক্ষর করা হবে, 1 টি পদক্ষেপে গণনা করা ((i += 5))কার্যকরভাবে কিছুই করে না - এটি 5 তে যোগ করে না, তবে তারপরে আমি আবার পুনরায় নিয়োগ দেওয়া হয় পরবর্তী পুনরাবৃত্তি

আমি মনে করি আমি for (( ; ; ))উত্তরটি সবচেয়ে ভাল পছন্দ করি তবে আপনি চিন্তাভাবনা করার জন্য এখানে কিছু বিকল্প রয়েছে:


যেহেতু আমরা 5 {a..b..i}টির বহুগুণ নিয়ে কাজ করছি এবং প্রসারিত ব্যাশ সংস্করণ 3.2.57 (1) (ওএস এক্সে) সমর্থিত নয়, তারপরে আমরা এর পরিবর্তে এই সামান্য আরকেন জিনিসটি করতে পারি:

for i in 375 {38..349}{0,5} 3500; do
    echo $i
done

এটি দেখায় যে কার্টেসিয়ান পণ্য তৈরি করতে ব্যাশ কীভাবে ব্যবহার করা যেতে পারে।


আমি মনে করি সাধারণভাবে লুপের জন্য এটি করা সবচেয়ে সুবিধাজনক উপায়, তবে আপনি যদি আগ্রহী হন তবে আপনি কিছুক্ষণের লুপটি (আপনার বেসিকের কিছুটা কাছাকাছি) প্রোগ্রামটি ব্যবহার করতে পারেন:

count=375
while (( count <= 3500 )); do
    echo $count
    (( count += 5 ))
done

1
@ জিম্মিজ ... কার্টেসিয়ান পণ্য কী? আপনি চাইলে আপনি মন্তব্যটি হ্রাস করতে পারেন এবং আপনি আমাকে বললে আমিও তার যত্ন নেব না। আমি কৌতুহলী.
মাইকসার্ভ

1
: @mikeserv আপনি মন্তব্য downvote করতে পারবে না en.wikipedia.org/wiki/Cartesian_product
jimmij

@ জিম্মিজ - আপনি যদি করেন তবে এটি আমার সাথে এখনও ঠিক আছে।
মাইকসার্ভ

@ জিম্মিজ আপনি কি শয়তানের কথা বলছেন? একটি কার্টেসিয়ান পণ্য হ'ল দুটি সেট (যা একই সেট হতে পারে বা নাও হতে পারে) থেকে প্রতিটি সম্ভাব্য সংমিশ্রণের টিপলগুলির একটি সেট। আরও কথোপকথন হিসাবে, এটি দুটি গ্রুপের জিনিস থেকে কেবল "সমস্ত সম্ভাব্য সংমিশ্রণ"। আমি কেবল একটি সেট দেখছি। এখানে কীভাবে কার্টেসিয়ান পণ্য রয়েছে?
jpmc26

1
@ jpmc26 আপনি ঠিক হয়, এটা "সব সম্ভাব্য সমাহার", তাই করতে দেয় চক্রান্ত দুই অক্ষ - প্রথম লেখার সমস্ত সংখ্যার 38পর্যন্ত 349। দ্বিতীয় মাত্র দুটি সংখ্যা: 0এবং 5। এখন ঐ সমস্ত সমাহারের আদেশ জোড়া তৈরি করতে দেয় - আপনি একটি সেট হিসাবে তাদের লিখতে পারেন: {38,0}, {38,5}... {349,5}, বা শুধু অপ্রয়োজনীয় প্রতীক অপসারণ {, ,এবং }এবং পেতে ... নতুন সংখ্যার 380... 3495
জিম্মিজ

5

অবশ্যই এটির জন্য একটি অ্যাপ্লিকেশন রয়েছে ( seq 375 5 3500), কমান্ডলাইন থেকে এটি করার বিভিন্ন উপায় রয়েছে। সবচেয়ে দ্রুত এবং সর্বাধিক সহজ ব্যবহার করা চলাকালীন seq, এখানে আরও কিছু বিকল্প রয়েছে:

for i in {375..3500}; do [[ (($i % 5)) -eq 0 ]] && echo $i; done

i=370; while [ $i -le 3500 ]; do printf "%s\n" $((i+=5)); done

perl -le '$i=shift;while($i<=$ARGV[0]){print $i; $i+=5; }' 375 3500
perl -le 'map{print $_ + 5} 370..3495'

awk 'BEGIN{ for(i=375;i<=3500;i+=5){print i}}'

নিট পিক: $(($i % 5))লেখা যেতে পারে $((i % 5))
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

4

POSIXly:

i=370
while [ 3500 -gt "$i" ]
do    echo "$((i+=5))"
done

... অথবা ...

echo 'for(x=370;x<=3500;x+=5)x' |bc

আমি জানি না কেন আপনি এটি অন্য কোনও উপায়ে করবেন। বাদে অবশ্যই ...

seq 375 5 3500

... বা সাথে dc:

echo '370[5+pd3500>p]splpx'|dc

dcকোডটি কীভাবে কাজ করে তা সম্পর্কে আমি আগ্রহী । এটি অবশ্যই ব্যবহারের চেয়ে আরও মজাদার seq
dhag

1
@ ধাগ - এটি একটি সামান্য লুপ লিখেছেন। এটা sAves [স্ট্রিং ]শীর্ষে pঅ্যারে, তারপর lএটি ফিরিয়ে oads স্ট্যাক এবং ই উপরের সম্মুখের xএকটি ম্যাক্রো যেমন ecutes করুন। ম্যাক্রোর মধ্যে আমরা 5স্ট্যাকের উপর চাপ দিই এবং তারপর এটি দ্বিতীয় এবং শীর্ষে এবং +সেগুলি থেকে পপ করব, উভয় স্ট্যাকের মানগুলিকে তাদের যোগফলের সাথে প্রতিস্থাপন করুন, যা pধুয়ে ফেলা হয় এবং dআগে সরানো 3500হয় স্ট্যাকের উপর চাপ দেওয়া হয়, যখন আমরা এটি পপ করি এবং আমরা যে ডুপের জন্য তৈরি করেছিলাম তুলনা >। যদি 3500বৃহত্তর হয় তবে আমরা pঅ্যারে (আমাদের বর্তমান ম্যাক্রো) এ থাকা স্ট্রিংটিকে ম্যাক্রো হিসাবে লোড এবং কার্যকর করি , না হলে ব্রেক না করে।
মাইক্রজার্ভ

3

যদি আপনি বাশ 3 এ আটকে থাকেন:

echo {375..3500} | tr ' ' '\n' | sed -n 'p;n;n;n;n'

এবং যদি আপনি পছন্দ করেন awk:

echo {375..3500} | tr ' ' '\n' | awk '!((NR-1)%5)'

আমি ব্রেস সম্প্রসারণ সম্পর্কে জানতাম না - এটি মারাত্মকভাবে দুর্দান্ত।

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