কোনও কমান্ডকে বহুবার পুনরাবৃত্তি করার জন্য কি কোনও মানক ইউনিক্স সরঞ্জাম রয়েছে?


13

এটি সম্ভবত মৃত সহজ, তবে কনসোলে একবার কমান্ড লেখার কোনও সহজ উপায় আছে এবং এটি কার্যকর করার nসময় nকি রানটাইম-এ নির্দিষ্ট করা হয়েছে? এটার মতো কিছু:

repeat 100 echo hello

এই ধরনের কমান্ড বিদ্যমান (আদর্শ লিনাক্স ইনস্টলেশন অনুমান)?

বা বাশে আমি কিছু ধরণের লুপ করতে লিখব?

উত্তর:


23

হ্যাঁ এটা সম্ভব। বাশের একটি খুব স্ক্রিপ্টিং ভাষা রয়েছে। এক্ষেত্রে:

for i in {1..100}; do echo 'hello'; done

আরও লুপিং উদাহরণ: http://www.cyberciti.biz/faq/bash-for-loop/
সম্পূর্ণ বাশ রেফারেন্স: http://www.gnu.org/software/bash/manual/bashref.html


কমান্ড ব্যর্থ হলে কি হয়?
মাযজা

আপনার ত্রুটিটি পরিচালনা করতে এটি ধরা পড়ে এবং পরিবর্তে কী করা উচিত তা কার্যকর করে।
জিয়ন

আমি চেষ্টা করেছি for i in {1..100}; do python3 foo.py ; doneএবং বাস্তবে মৃত্যুদন্ডের সময়টি পেতে (কত দ্রুত দেখুন তা বোঝার জন্য) time for i in {1..100}; do python3 foo.py ; doneএবং তারপরে সিটিআরএল-সি লুপটি থামাতে সক্ষম
হবেনা

3

বা বাশে আমি কিছু ধরণের লুপ করতে লিখব?

হ্যাঁ, আপনি এটি পছন্দ করেন:

for(( i = 0; i < 100; i++ )); do echo "hello"; done

বা, সংক্ষিপ্ত:

for((i=100;i--;)); do echo "hello"; done

এবং তারপরে সেই স্টাফটিকে একটি ফাংশন এবং ভয়েলাতে রাখুন, আপনার আদেশ আছে: পুনরায় () repeat for_stuff_ এখানে; "$ @" করুন; সম্পন্ন}
আকিরা

3

পদ্ধতিগুলিতে আরও অন্তর্নির্মিত ছাড়াও আপনি একটি বাহ্যিক ইউটিলিটি ব্যবহার করতে পারেন যা সংখ্যার ক্রম তৈরি করে।

# gnu coreutils provides seq
for i in $(seq 1 100) ; do printf "hello\n" ; done

# freebsd (and probably other bsd) provides jot
for i in $(jot - 1 100) ; do printf "hello\n" ; done

3

লুপ সিনট্যাক্সের জন্য নির্বোধ। এটি সংক্ষিপ্ত:

seq 10|xargs -I INDEX echo "print this 10 times"

2

এই কাজটি করার জন্য আমি একটি "স্ট্যান্ডার্ড" লিনাক্স সরঞ্জামটি পাইনি, তবে আমি সাধারণত আমার ডট ফাইলগুলি (.bashrc, .vimrc ইত্যাদি) ইনস্টলেশন থেকে ইনস্টলেশন পর্যন্ত সংরক্ষণ করি, সুতরাং আপনি যদি এটিকে দেখেন তবে নীচেরটি বেশ "স্ট্যান্ডার্ড" থাকে নতুন ইনস্টলেশনগুলিতে আপনার ডট ফাইল সংরক্ষণের দৃষ্টিভঙ্গি:

আপনার .bashrc বা .Bash_aliases শেষে, নিম্নলিখিত সংজ্ঞাটি রাখুন:

repeat() {
  n=$1    #gets the number of times the succeeding command needs to be executed
  shift   #now $@ has the command that needs to be executed
  while [ $(( n -= 1 )) -ge 0 ]    #loop n times;
  do
    "$@"    #execute the command; you can also add error handling here or parallelize the commands
  done
}

ফাইলটি সংরক্ষণ করুন এবং হয় শেলটি আবার খুলুন বা চালিত করুন source /path/to/.bashrcবা source /path/to/.bash_aliasesআপনি যে কোনওটিকে শেল পরিবর্তন করতে বেছে নিতে পারেন an

এটাই! আপনি নিম্নলিখিত পদ্ধতিতে এটি ব্যবহার করতে সক্ষম হওয়া উচিত:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

প্রভৃতি


সুন্দর। বিশ্বব্যাপী পরিবর্তনশীল নেমস্পেসকে দূষিত করা এড়াতে এন = $ 1 এর সামনে "স্থানীয়" রাখা ভাল হবে
ডন হ্যাচ

0

বর্তমানে, অন্য কোনও উত্তরই মানক ইউনিক্স সরঞ্জাম ব্যবহার করছে না যা শিরোনামের প্রশ্নটি জিজ্ঞাসা করছে।

এগুলি সকলেই হয় নন স্ট্যান্ডার্ড কমান্ড ( seqবা jot) বা শেল এক্সটেনশান (সি-স্টাইল forলুপ বা ব্রেস এক্সপেনশন) ব্যবহার করে, অর্থাত্ তারা সকলেই পসিক্স স্ট্যান্ডার্ডের সাথে আটকে থাকতে ব্যর্থ হয়।

এখানে একটি বহনযোগ্য উপায় যা কোনও পসিক্স অনুগত শেল এবং অপারেটিং সিস্টেমের সাথে কাজ করা উচিত:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.