Shell bucles utilizando no enteros?
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?
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 $ (
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