Pregunta

escribí un archivo .sh para compilar y ejecutar unos programas para una tarea. Tengo un bucle "for" en el guión, pero no va a funcionar a menos que utilice sólo enteros:

#!/bin/bash
for (( i=10; i<=100000; i+=100))
do
    ./hw3_2_2 $i
done

La variable $ i es una entrada para el programa de hw3_2_2, y tengo valores no enteros que me gustaría utilizar. ¿Cómo podría hacerlo a través del bucle se ejecuta el código con una lista de números decimales?

¿Fue útil?

Solución

Me parece sorprendente que en cinco años nadie menciona la utilidad creada sólo para la generación de rangos, pero, de nuevo, se trata de BSD alrededor de 2005, y tal vez ni siquiera estaba generalmente disponible en Linux en el momento de la se hizo la pregunta.

Pero aquí está:

for i in $(seq 0 0.1 1)

O, para imprimir todos los números con la misma anchura (anteponiendo o añadiendo ceros), utilice -w. Eso ayuda a prevenir los números que se envían como "enteros", si eso fuera a causar problemas.

La sintaxis es seq [first [incr]] last, con first defecto a 1, y incr defecto a 1 o -1, dependiendo de si last es mayor que o menor que first. Para otros parámetros, consulte seq (1) .

Otros consejos

se puede usar awk para generar sus decimales, por ejemplo, los pasos of0.1

num=$(awk 'BEGIN{for(i=1;i<=10;i+=0.1)print i}')
for n in $num
do
  ./hw3_2_2 $n
done

o puede hacerlo en su totalidad en awk

awk 'BEGIN{cmd="hw3_2_2";for(i=1;i<=10;i+=0.1){c=cmd" "i;system(cmd) } }'

La forma más fácil es simplemente una lista de ellas:

for a in 1.2 3.4 3.11 402.12 4.2 2342.40
do
  ./hw3_2_2 $a
done

Si la lista es enorme, por lo que no puede tenerlo como una lista literal, considere deshacerse de ellos en un archivo y luego usar algo como

for a in $(< my-numbers.txt)
do
  ./hw3_2_2 $a
done

El $ (cat para esto.

Aquí hay otra manera. Puede utilizar un doc aquí para incluir sus datos en la secuencia de comandos:

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

Del mismo modo:

array=(
1.1
2.12
3.14159
4
5.05
)

for i in "${array[@]}"
do
    ./hw3_2_2 "$i"
done

I por lo general también uso "ss" como por la segunda respuesta, pero Sólo para dar una respuesta en términos de un bucle de número entero de precisión-robusta y luego bc conversión a un flotador:

#!/bin/bash 

for i in {2..10..2} ; do 
  x=`echo "scale=2 ; ${i}/10" | bc`
  echo $x
done

da:

0.2 0.4 0.6 0.8 1.0

fiesta no hace números decimales. O bien usar algo como bc que pueden, o trasladarse a un lenguaje de programación más completa. Cuidado con href="http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems" sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top