আমি যেমন বেসিক লুপ খুঁজছি:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
তবে বাশার জন্য
উত্তর:
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
ArrayLength=${#array[@]}
এখানে এটি ব্যবহার না করে কীভাবে করব max
?
ব্যাশটি for
একটি চলক (পুনরুক্তি) এবং শব্দের একটি তালিকাতে থাকে যেখানে পুনরুক্তিটি ভাল, পুনরাবৃত্তি করবে।
সুতরাং, আপনার যদি শব্দের একটি সীমাবদ্ধ তালিকা থাকে তবে কেবল সেগুলিকে নিম্নলিখিত সিনট্যাক্সে রাখুন:
for w in word1 word2 word3
do
doSomething($w)
done
সম্ভবত আপনি কয়েকটি সংখ্যার সাথে পুনরাবৃত্তি করতে চান, যাতে আপনার seq
পক্ষে সংখ্যাগুলির একটি তালিকা তৈরি করতে আপনি কমান্ডটি ব্যবহার করতে পারেন : (উদাহরণস্বরূপ 1 থেকে 100 পর্যন্ত)
seq 1 100
এবং এটি ফর লুপে ব্যবহার করুন:
for n in $(seq 1 100)
do
doSomething($n)
done
$(...)
সিনট্যাক্স নোট করুন । এটি একটি বাশ আচরণ, এটি আপনাকে একটি কমান্ড থেকে আউটপুট (আমাদের ক্ষেত্রে seq
) থেকে অন্য (দ্য for
) এ সরবরাহ করতে দেয়
আপনি যখন কোনও কোনও পথের সমস্ত ডিরেক্টরিতে পুনরাবৃত্তি করতে চান এটি সত্যিই দরকারী for
for d in $(find $somepath -type d)
do
doSomething($d)
done
সম্ভাবনাগুলি তালিকা তৈরি করতে অসীম।
বাশ 3.0+ এই বাক্য গঠনটি ব্যবহার করতে পারে:
for i in {1..10} ; do ... ; done
.. যা ক্রম (যেমন seq 1 10
) প্রসারিত করার জন্য কোনও বাহ্যিক প্রোগ্রাম তৈরি করা এড়িয়ে চলে ।
অবশ্যই, for(())
সমাধানটির মতো একই সমস্যা রয়েছে , ব্যাশ এবং এমনকি একটি বিশেষ সংস্করণে আবদ্ধ হওয়া (যদি এটি আপনার কাছে বিবেচিত হয়)।
ব্যবহার করে দেখুন bash
বিল্ট-ইন সাহায্যের:
$ help for
for: for NAME [in WORDS ... ;] do COMMANDS; done
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
omitted, it behaves as if it evaluates to 1.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
এখানে একটি উদাহরণ রয়েছে যা পুরানো শেলগুলিতেও কাজ করতে পারে, যদিও এখনও বড় অঙ্কের জন্য দক্ষ হয়:
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
তবে সৌভাগ্য এর অভ্যন্তরে দরকারী জিনিসগুলি করছে awk
: আমি কীভাবে কোনও শূন্য স্ক্রিপ্টে শেল ভেরিয়েবল ব্যবহার করব?
do
/ done
জুটির পরিবর্তে কোঁকড়ানো-ধনুর্বন্ধনী ব্যবহার ।
আমি সাধারণত লুপের জন্য স্ট্যান্ডার্ডে কিছুটা বৈকল্পিক ব্যবহার করতে চাই। আমি প্রায়শই দূরবর্তী হোস্টগুলির একটি সিরিজে কমান্ড চালাতে এটি ব্যবহার করি। আমি লুপগুলি তৈরি করতে ব্যাশের ব্রেস প্রসারের সুবিধা গ্রহণ করি যা আমাকে লুপগুলি অ-সংখ্যাযুক্ত তৈরি করতে দেয় create
উদাহরণ:
আমি ফ্রন্টএন্ড হোস্টগুলি 1-5 এবং ব্যাকএন্ড হোস্টগুলিতে 1-3- তে আপটাইম কমান্ড চালাতে চাই:
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"
done
আমি সাধারণত উপরের আরও পঠনযোগ্য সংস্করণের পরিবর্তে লাইনের শেষ প্রান্তে সেমিকোলন সহ একটি একক-লাইন কমান্ড হিসাবে এটি চালিত করি। মূল ব্যবহারের বিবেচনাটি হ'ল বন্ধনীগুলি আপনাকে একাধিক মান নির্দিষ্ট করে স্ট্রিংয়ের মধ্যে সন্নিবেশ করতে দেয় (যেমন প্রাক {ফু, বার} পোস্টের প্রিফোপস্ট, প্রাইবারপোস্টে ফলাফল) এবং ডাবল পিরিয়ড ব্যবহার করে গণনা / ক্রমগুলি মঞ্জুরি দেয় (আপনি একটি ব্যবহার করতে পারেন)। .z ইত্যাদি)। যাইহোক, ডাবল পিরিয়ড সিনট্যাক্স বাশ 3.0 এর একটি নতুন বৈশিষ্ট্য; পূর্ববর্তী সংস্করণগুলি এটিকে সমর্থন করবে না।
যদি আপনি কেবল বাশকে উপরের দিকে উপস্থাপিত "((...))" সমাধানটি সেরা হন তবে আপনি যদি পসিক্স এসএইচ অনুগত কিছু চান যা সমস্ত সংযোগে কাজ করবে আপনাকে "এক্সপ্রেস" ব্যবহার করতে হবে এবং "যখন" এবং এটি কারণ "(())" বা "সিক" বা "আই = আই +1" বিভিন্ন শেলের মধ্যে পোর্টেবল নয়
আমি ফাইলগুলি প্রক্রিয়া করার জন্য এই সময়ের বিভিন্নতা ব্যবহার করি ...
* .log এ ফাইলগুলির জন্য; "এর সাথে করণীয়: $ ফাইলগুলি" প্রতিধ্বনি করুন; প্রতিধ্বনি "আরও স্টাফ করুন: $ ফাইলগুলি"; সম্পন্ন;
যদি আপনার ফাইলগুলির তালিকাগুলির তালিকাগুলি আপনার আগ্রহী হয় তবে ফাইলগুলির জন্য -xecdir বিকল্পটি দেখুন ।