Saltar al contenido

Bash multiplicación y suma

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *