سؤال

لقد كتبت ملف .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 يمكن ذلك ، أو الانتقال إلى لغة برمجة أكثر اكتمالا. احترس من مشاكل الدقة رغم ذلك.

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