De hecho, como mencionó @Jan, puede usar printf con %e. @Will mencionó la opción %g, pero eso no es necesariamente una notación científica (ver más abajo ).
Se basa en el printf de C que ya conoce.
CPU_FREQ=$(printf "%e" $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq))
El comando printf funciona así:
var=1
printf "print a float variable %f, or an integer literal. %d" $var 2
Puede usar %g, %e, %G o %E. también, con parámetros enteros literales adicionales opcionales a,b, p. :%a.bf
Brevemente, el parámetro opcional a es el tamaño de ancho mínimo (que se ignora si se reenvía la salida en una variable ).
%.be lo imprime con exactamente b decimales, redondeando el relleno con ceros si es necesario. %.bg imprime el resultado con b cifras significativas, ignorando todos los ceros finales. (También se puede pensar como el más corto entre %f y %e dos, pero vale la pena notarlo nuevamente, es sin ceros finales.)
Ejemplos:
R=10000001
printf "%e\n" $R
1.000000e+07
printf "%g\n" $R
1e+07
R=1.0000001
printf "%e\n" $R
1.000000e+00
printf "%g\n" $R
1
R=1000000.1
printf "%e\n" $R
1.000000e+06
printf "%g\n" $R
1e+06
R=.10000001
printf "%e\n" $R
1.000000e-01
printf "%g\n" $R
0.1
(%G y %E son como %g y %e, pero imprimen la salida en mayúsculas, lo que solo se aplica a la e que se convierte en una E.)