আমি কীভাবে ল্যাশের জন্য ব্যাশে লিখব


95

আমি যেমন বেসিক লুপ খুঁজছি:

for(int i = 0; i < MAX; i++) {
  doSomething(i);
}

তবে বাশার জন্য


উত্তর:


106

এই সাইট থেকে :

for i in $(seq 1 10);
do
    echo $i
done

10
এখানে উল্লেখ করা পরিসরটি অন্তর্ভুক্তিযুক্ত এটি উল্লেখযোগ্য । এর অর্থ, আপনি কনসোলে মুদ্রিত পুরো ব্যাপ্তি (1 থেকে 10) দেখতে পাবেন mean
জেমি


34

ব্যাশটি 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

সম্ভাবনাগুলি তালিকা তৈরি করতে অসীম।


4
ভাল উত্তর, তবে আপনি এর জন্য অন্তর্ভুক্ত করতে চাইতে পারেন ((i = 0; i <MAX; i ++)); doSomething ($ i); পাশাপাশি বৈকল্পিক সম্পন্ন। আমি মনে করি এটি সাধারণত $ (seq 0 MAX) ভেরিয়েন্টের জন্য পছন্দ হয় কারণ লটারটি প্রকৃতপক্ষে লুপটি কার্যকর করার আগে প্রথমে 0 থেকে ম্যাক্স পর্যন্ত সমস্ত সংখ্যা উত্পন্ন করে।
mweerden

30

বাশ 3.0+ এই বাক্য গঠনটি ব্যবহার করতে পারে:

for i in {1..10} ; do ... ; done

.. যা ক্রম (যেমন seq 1 10) প্রসারিত করার জন্য কোনও বাহ্যিক প্রোগ্রাম তৈরি করা এড়িয়ে চলে ।

অবশ্যই, for(())সমাধানটির মতো একই সমস্যা রয়েছে , ব্যাশ এবং এমনকি একটি বিশেষ সংস্করণে আবদ্ধ হওয়া (যদি এটি আপনার কাছে বিবেচিত হয়)।


14

ব্যবহার করে দেখুন 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.



5
#! /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: আমি কীভাবে কোনও শূন্য স্ক্রিপ্টে শেল ভেরিয়েবল ব্যবহার করব?


4
আমি এটি আগে লক্ষ্য করিনি, তবে পূর্বের উত্তরগুলির মধ্যে একটির মতো অনুরূপ বাক্য গঠন দেখানো হয়েছে। এখানে অনন্য জিনিসটি হ'ল টিপিক্যাল do/ doneজুটির পরিবর্তে কোঁকড়ানো-ধনুর্বন্ধনী ব্যবহার ।
ব্রেন্ট ব্র্যাডবার্ন

4

আমি সাধারণত লুপের জন্য স্ট্যান্ডার্ডে কিছুটা বৈকল্পিক ব্যবহার করতে চাই। আমি প্রায়শই দূরবর্তী হোস্টগুলির একটি সিরিজে কমান্ড চালাতে এটি ব্যবহার করি। আমি লুপগুলি তৈরি করতে ব্যাশের ব্রেস প্রসারের সুবিধা গ্রহণ করি যা আমাকে লুপগুলি অ-সংখ্যাযুক্ত তৈরি করতে দেয় 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 এর একটি নতুন বৈশিষ্ট্য; পূর্ববর্তী সংস্করণগুলি এটিকে সমর্থন করবে না।


এর সাথে সম্পর্কিত, $ হোস্ট ভার যদি কোনও দুর্ঘটনার দ্বারা খালি লাইন হয়? এটি এখনও ssh আগুন হবে। তাহলে, আমি কীভাবে এড়াতে পারি? আমার ক্ষেত্রে আমি কিছু আলাদা করছি এবং তাই আপনার উত্তর আমাকে সহায়তা করবে will আমি নতুন বার্তাগুলির জন্য জিমেইল চেক করার চেষ্টা করছি, এবং যদি খুঁজে পাওয়া যায় তবে থেকে এবং বিষয়টির একটি এসএমএস পাঠান। আমার প্রশ্নটি যদি আপনি এটি পড়তে চান তবে "কানেক্টিং টু ব্যাশ কমান্ডগুলি" লেবেলযুক্ত।
ভলমাইক

আমি বিশ্বাস করি না যে আপনি খালি $ হোস্ট ভার পাবেন। এটি কারণ কারণ উপরের উদাহরণটি ব্রেস প্রসার ব্যবহার করছে। ফর লুপটি স্পষ্টভাবে $ হোস্ট ভেরিয়েবলকে মানগুলিতে সেট করে: frontend1.mycompany.com frontend2.mycompany.com। । backend1.mycompany.com তবে আপনি যদি এটির নাল মান রাখার কোনও উপায় দেখেন; আমি জানতে আগ্রহী। শর্তসাপেক্ষ টেস্টের মধ্যে আপনি যদি এসএসএস চালাতে পারেন তবে এটি উদ্বেগজনক ছিল।
টারসন

1

যদি আপনি কেবল বাশকে উপরের দিকে উপস্থাপিত "((...))" সমাধানটি সেরা হন তবে আপনি যদি পসিক্স এসএইচ অনুগত কিছু চান যা সমস্ত সংযোগে কাজ করবে আপনাকে "এক্সপ্রেস" ব্যবহার করতে হবে এবং "যখন" এবং এটি কারণ "(())" বা "সিক" বা "আই = আই +1" বিভিন্ন শেলের মধ্যে পোর্টেবল নয়


0

আমি ফাইলগুলি প্রক্রিয়া করার জন্য এই সময়ের বিভিন্নতা ব্যবহার করি ...

* .log এ ফাইলগুলির জন্য; "এর সাথে করণীয়: $ ফাইলগুলি" প্রতিধ্বনি করুন; প্রতিধ্বনি "আরও স্টাফ করুন: $ ফাইলগুলি"; সম্পন্ন;

যদি আপনার ফাইলগুলির তালিকাগুলির তালিকাগুলি আপনার আগ্রহী হয় তবে ফাইলগুলির জন্য -xecdir বিকল্পটি দেখুন ।


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