حلقات الصدفة باستخدام غير المنصفين؟
سؤال
لقد كتبت ملف .sh لتجميع وتشغيل بعض البرامج لإجراءات الواجب المنزلي. لدي حلقة "من أجل" في البرنامج النصي ، لكنها لن تعمل إلا إذا كنت أستخدم الأعداد الصحيحة فقط:
#!/bin/bash
for (( i=10; i<=100000; i+=100))
do
./hw3_2_2 $i
done
المتغير $ I هو إدخال للبرنامج HW3_2_2 ، ولدي قيم غير مستقرة أود استخدامها. كيف يمكنني أن أحلق من خلال تشغيل الكود بقائمة من الأرقام العشرية؟
المحلول
أجد أنه من المستغرب أنه في غضون خمس سنوات ، لم يذكر أحد الأداة التي تم إنشاؤها فقط لتوليد نطاقات ، ولكن ، مرة أخرى ، تأتي من BSD حوالي عام 2005 ، وربما لم تكن متوفرة بشكل عام على Linux في الوقت الذي تم فيه طرح السؤال .
ولكن هنا هو:
for i in $(seq 0 0.1 1)
أو ، لطباعة جميع الأرقام بنفس العرض (عن طريق إعداد الأصفار أو إلحاقها) ، استخدم -w
. يساعد ذلك على منع الأرقام التي يتم إرسالها على أنها "أعداد صحيحة" ، إذا كان ذلك سيؤدي إلى حدوث مشكلات.
بناء الجملة seq [first [incr]] last
, ، مع first
التخلف عن السداد 1 ، و incr
التخلف إما 1 أو -1 ، اعتمادا على ما إذا كان last
أكبر من أو أقل من first
. للحصول على معايير أخرى ، انظر Seq (1).
نصائح أخرى
يمكنك استخدام AWK لتوليد العشريات على سبيل المثال0.1
num=$(awk 'BEGIN{for(i=1;i<=10;i+=0.1)print i}')
for n in $num
do
./hw3_2_2 $n
done
أو يمكنك القيام بذلك بالكامل في Awk
awk 'BEGIN{cmd="hw3_2_2";for(i=1;i<=10;i+=0.1){c=cmd" "i;system(cmd) } }'
أسهل طريقة هي فقط سردها:
for a in 1.2 3.4 3.11 402.12 4.2 2342.40
do
./hw3_2_2 $a
done
إذا كانت القائمة ضخمة ، لذلك لا يمكنك الحصول عليها كقائمة حرفية ، فكر في إلقاءها في ملف ثم استخدام شيء مثل
for a in $(< my-numbers.txt)
do
./hw3_2_2 $a
done
جزء $ (<my-numbers.txt) هو طريقة فعالة (في باش) لاستبدال محتويات ملف الأسماء في هذا الموقع من البرنامج النصي. بفضل دينيس ويليامسون للإشارة إلى أنه لا توجد حاجة لاستخدام الخارجي cat
أمر لهذا.
هذه طريقة أخرى. يمكنك استخدام مستند هنا لتضمين بياناتك في البرنامج النصي:
read -r -d '' data <<EOF
1.1
2.12
3.14159
4
5.05
EOF
for i in "$data"
do
./hw3_2_2 "$i"
done
بصورة مماثلة:
array=(
1.1
2.12
3.14159
4
5.05
)
for i in "${array[@]}"
do
./hw3_2_2 "$i"
done
عادةً ما أستخدم "SEQ" وفقًا للإجابة الثانية ، ولكن فقط لإعطاء إجابة من حيث حلقة عدد صحيح الدقة ، ثم تحويل BC إلى تعويم:
#!/bin/bash
for i in {2..10..2} ; do
x=`echo "scale=2 ; ${i}/10" | bc`
echo $x
done
يعطي:
.2 .4 .6 .8 1.0
باش لا يفعل أرقام عشرية. إما استخدام شيء مثل bc
يمكن ذلك ، أو الانتقال إلى لغة برمجة أكثر اكتمالا. احترس من مشاكل الدقة رغم ذلك.