Usando expansão aritmética:
for (( k = 0; k < 50; ++k )); do
a=$(( 2*k + 1 ))
echo "$a"
done
Usando expr
:
for (( k = 0; k < 50; ++k )); do
a=$( expr 2 '*' "$k" + 1 )
echo $a
done
Usando bc -l
( -l
não é realmente necessário neste caso, pois nenhuma função matemática é usada):
for (( k = 0; k < 50; ++k )); do
a=$( bc -l <<<"2*$k + 1" )
echo "$a"
done
Usando bc -l
como co-processo (age como uma espécie de serviço de computação no plano de fundo¹):
coproc bc -l
for (( k = 0; k < 50; ++k )); do
printf "2*%d + 1\n" "$k" >&${COPROC[1]}
read -u "${COPROC[0]}" a
echo "$a"
done
kill "$COPROC_PID"
Esse último parece (sem dúvida) mais limpo em 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"
¹ Isso resolveu um problema para mim uma vez em que precisei processar uma grande quantidade de entrada em um loop. O processamento exigia alguns cálculos de ponto flutuante, mas gerar bc
algumas vezes no loop mostrou-se extremamente lento. Sim, eu poderia ter resolvido isso de muitas outras maneiras, mas eu estava entediado ...