Solución:
Usando expansión aritmética:
for (( k = 0; k < 50; ++k )); do
a=$(( 2*k + 1 ))
echo "$a"
done
Usando lo anticuado expr
utilidad:
for (( k = 0; k < 50; ++k )); do
a=$( expr 2 '*' "$k" + 1 )
echo "$a"
done
Utilizando bc -l
(-l
en realidad no es necesario en este caso, ya que no se utilizan funciones matemáticas):
for (( k = 0; k < 50; ++k )); do
a=$( bc -l <<<"2*$k + 1" )
echo "$a"
done
Utilizando bc -l
como un coproceso (actúa como una especie de servicio de cálculo en segundo plano):
coproc bc -l
for (( k = 0; k < 50; ++k )); do
printf "2*%d + 1n" "$k" >&$COPROC[1]
read -u "$COPROC[0]" a
echo "$a"
done
kill "$COPROC_PID"
Ese último se ve (posiblemente) más limpio en ksh93
:
bc -l |&
bc_pid="$!"
for (( k = 0; k < 50; ++k )); do
print -p "2*$k + 1"
read -p a
print "$a"
done
kill "$bc_pid"
¹ Esto me resolvió un problema una vez en el que necesitaba procesar una gran cantidad de entrada en un bucle. El procesamiento requirió algunos cálculos de punto flotante, pero el desove bc
unas cuantas veces en el bucle resultó ser extremadamente lento. Sí, podría haberlo solucionado de muchas otras formas, pero estaba aburrido …
Puedes simplificar:
a=$(($((2*$k))+1));
para:
a=$((2*k+1))
Puedes usar el let
comando para forzar un cálculo.
let a="2*k+1"
Tenga en cuenta que no necesitamos $k
en esta estructura; un simple k
hará el trabajo.