Using arithmetic expansion:

for (( k = 0; k < 50; ++k )); do
a=$(( 2*k + 1 )) echo "$a"
done


Using the antiquated expr utility:

for (( k = 0; k < 50; ++k )); do
a=$( expr 2 '*' "$k" + 1 )
echo "$a" done  Using bc -l (-l not actually needed in this case as no math functions are used): for (( k = 0; k < 50; ++k )); do a=$( bc -l <<<"2*$k + 1" ) echo "$a"
done


Using bc -l as a co-process (it acts like a sort of computation service in the background¹):

coproc bc -l

for (( k = 0; k < 50; ++k )); do
printf "2*%d + 1\n" "$k" >&${COPROC}
read -u "${COPROC}" a echo "$a"
done

kill "$COPROC_PID"  That last one looks (arguably) cleaner in 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"  ¹ This solved a an issue for me once where I needed to process a large amount of input in a loop. The processing required some floating point computations, but spawning bc a few times in the loop proved to be exceedingly slow. Yes, I could have solved it in many other ways, but I was bored... You can simplify: a=$(($((2*$k))+1));


to:

a=$((2*k+1))  You can use the let command to force a calculation. let a="2*k+1"  Note that we don't need $k in this structure; a simple k will do the job.