سؤال

أنا أبحث عن الحلقة الأساسية مثل:

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

ولكن باش.

هل كانت مفيدة؟

المحلول

من هذا الموقع:

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

نصائح أخرى

for ((i = 0 ; i < max ; i++ )); do echo "$i"; done

باش 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 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.


أنا عادة ترغب في استخدام الخيار طفيف على معيار حلقة.أنا غالبا ما تستخدم هذا إلى تشغيل الأوامر على سلسلة من المضيفين البعيدين.أنا الاستفادة من باش هدفين التوسع لإنشاء الحلقات التي تسمح لي خلق غير العددية على الحلقات.

على سبيل المثال:

أريد تشغيل الجهوزية الأوامر في الواجهة يستضيف 1-5 و الخلفية يستضيف 1-3:

% for host in {frontend{1..5},backend{1..3}}.mycompany.com
    do ssh $host "echo -n $host; uptime"
  done

أنا عادة بتشغيل هذا واحد سطر الأوامر مع الفاصلة المنقوطة على طرفي خطوط بدلا من أكثر قابلية للقراءة النسخة أعلاه.مفتاح استخدام الاعتبار أن الأقواس تسمح لك بتحديد قيم متعددة ليتم إدراجها في سلسلة (على سبيل المثالقبل{فو,بار}بعد النتائج في prefoopost, prebarpost) و تسمح عد/تسلسل باستخدام مزدوج فترات (يمكنك استخدام a..z.... الخ).ومع ذلك ، فإن ضعف الفترة بناء الجملة هي ميزة جديدة من باش 3.0;الإصدارات السابقة لا تدعم هذا.

#! /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: كيف يمكنني استخدام قذيفة المتغيرات في awk السيناريو ؟

إذا كنت intereased فقط في سحق "ل(( ...))" حل عرضت أعلاه هو أفضل, ولكن إذا كنت تريد شيئا POSIX SH المتوافقة التي سوف تعمل على جميع unices سيكون لديك لاستخدام "expr" و "حين" لان "(())" أو "يليها" أو "i=i+1" ليست المحمولة بين مختلف قذائف

يمكنني استخدام أشكال مختلفة من هذا في كل وقت لمعالجة الملفات...

عن الملفات في *.تسجيل ؛ لا صدى "أفعل أشياء مع:$الملفات";صدى "بذل المزيد من الأشياء:$الملفات";القيام به ؛

إن تجهيز قوائم الملفات هو ما كنت ترغب في النظر في -execdir الخيار الملفات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top