variable not found comando arithmetic bash unix bc

bash - not - ¿Cómo obtengo bc(1) para imprimir el cero inicial?



bc command not found (11)

Hago algo como lo siguiente en un Makefile:

echo "0.1 + 0.1" | bc

(en el archivo real, los números son dinámicos, por supuesto)

Imprime .2 pero quiero que imprima 0.2 .

Me gustaría hacer esto sin recurrir a sed pero parece que no puedo encontrar la manera de hacer que bc imprima el cero. ¿O simplemente no puede hacer esto?


Basándose en la answer potongs,

Para resultados fraccionarios:

echo "x=0.1 + 0.1; if(x<1 && x > 0) print 0; x" | bc -l

Tenga en cuenta que los resultados negativos no se mostrarán correctamente. Aquarius Power tiene una solution para eso.


Después de echar un vistazo rápido a la fuente (ver bc_out_num() , línea 1461), no veo una manera obvia de hacer que el 0 inicial se imprima si la parte entera es 0 . A menos que omita algo, este comportamiento no depende de un parámetro que se puede cambiar usando el indicador de línea de comando.

Respuesta corta: no, no creo que haya una manera de hacer números impresos en bc la manera que desee.

No veo nada de malo con el uso de sed si aún quieres usar bc . Lo siguiente no se ve tan horrible, en mi humilde opinión:

[me@home]$ echo "0.1 + 0.1" | bc | sed ''s/^/./0./'' 0.2

Si realmente quieres evitar sed , las eljunior''s y de la choroba''s son bastante choroba''s , pero requieren ajustes dependientes del valor para evitar los ceros al final. Eso puede o no ser un problema para ti.


Este también manejará números negativos:

echo "0.1 - 0.3" | bc | sed -r ''s/^(-?)/.//10./''


Esto podría funcionar para usted:

echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc


No puedo encontrar nada sobre el formato de salida en la documentación. En lugar de sed, también puedes usar printf:

printf ''%3.1f/n'' $(bc<<<0.1+0.1)


Para números positivos, puede ser tan simple como imprimir (una cadena) cero:

$ echo ''"0";0.1+0.1'' | bc 0.2

evite el cero si el número es mayor (o igual) a 1:

$ echo ''x=0.1+0.1; if(x<1){"0"}; x'' | bc 0.2

Se vuelve un poco más complejo si el número puede ser negativo:

echo ''x= 0.3 - 0.5 ; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1) {"0"};x'' | bc -0.2

Puede definir una función y agregarla a una biblioteca:

$ echo ''define leadzero(x){auto s; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"}; return(x)}; leadzero(2.1-12.4)'' | bc -10.3 $ echo ''define leadzero(x){auto s; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"}; return(x)}; leadzero(0.1-0.4)'' | bc -0.3


Probablemente, bc no es realmente la mejor "calculadora de banco" para la edad moderna. Otros idiomas te darán más control. Aquí hay ejemplos de trabajo que imprimen valores en el rango (-1.0 .. + 1.0) con un cero inicial. Estos ejemplos usan bc , AWK y Python 3 .

#!/bin/bash echo "using bc" time for (( i=-2; i<=+2; i++ )) { echo $(bc<<<"scale=1; x=$i/2; if (x==0||x<=-1||x>=1) { print x } else { if (x<0) { print /"-0/";-x } else { print /"0/";x } } ") } echo echo "using awk" time for (( i=-2; i<=+2; i++ )) { echo $(echo|awk "{printf /"%.1f/",$i/2}") } echo echo "using Python" time for (( i=-2; i<=+2; i++ )) { echo $(python3<<<"print($i/2)") }

Tenga en cuenta que la versión de Python es aproximadamente 10 veces más lenta, si eso es importante.


También puede recurrir a awk para formatear:

echo "0.1 + 0.1" | bc | awk ''{printf "%f", $0}''

o con awk haciendo los cálculos:

echo "0.1 0.1" | awk ''{printf "%f", $1 + $2}''


esto solo usa bc, y funciona con números negativos:

bc <<< "x=-.1; if(x==0) print /"0.0/" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print /"-0/",-x else print x";

Pruébalo con:

for y in "0" "0.1" "-0.1" "1.1" "-1.1"; do bc <<< "x=$y; if(x==0) print /"0.0/" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print /"-0/",-x else print x"; echo; done


echo "$a / $b" | bc -l | sed -e ''s/^-/./-0./'' -e ''s/^/./0./''

Esto debería funcionar para todos los casos donde los resultados son:

  • "-.123"
  • ".123"
  • "-1.23"
  • "1,23"

Explicación:

  1. Para todo lo que solo comienza con -. , reemplazar -. con -0.

  2. Para todo lo que solo comienza . , reemplazar . con 0.


$ bc -l <<< ''x=-1/2; if (length (x) == scale (x) && x != 0) { if (x < 0) print "-",0,-x else print 0,x } else print x''

Este es puro bc . Detecta el cero al comparar el resultado de la length con la scale de la expresión. Funciona tanto en número positivo como negativo.