2009-08-10 24 views
21

Sé que es muy estúpida pregunta, pero no sé cómo hacer esto en bash:Cómo usar expr en float?

20/30 * 100 

Cabe 66.67 pero expr es decir 0, ya que no es compatible con flotador. ¿Qué comando en Linux puede reemplazar expr y hacer esta ecuaciones?

+1

smok, nie tykaj :) – lauriys

+0

Lo siento, mea culpa, mea maxima! – smok1

+0

para operaciones matemáticas, intente usar bc o awk, no bash o expr – ghostdog74

Respuesta

4

Como se informó en la página bash man:

El shell permite que las expresiones aritméticas sean eval uated, bajo ciertas circunstancias ... La evaluación se realiza en enteros de ancho fijo sin verificación de desbordamiento, aunque la división por 0 queda atrapada y marcada como un error.

Puede multiplicar por 100 antes para obtener un mejor resultado, parcial:

let j=20*100/30 
echo $j 

o por un múltiplo más alto de 10, e imaginar el decimal donde debe estar:

let j=20*10000/30 
echo $j 
+0

Podría ser útil si publicó la línea de comando real que utilizó.(Supongo que usaste más ceros que yo.) Ejecuté los comandos anteriores antes de publicar y obtuve los resultados. Por favor prueba primero. –

+0

let j = 20 * 100/30 – lauriys

+0

Huh, extraño, no recuerdo poner espacios allí originalmente. De todos modos, intente eliminar sus espacios y repita. Edité mi publicación para eliminar el espacio en blanco problemático. –

27

bc hará esto por usted, pero el orden es importante.

> echo "scale = 2; 20 * 100/30" | bc 
66.66 
> echo "scale = 2; 20/30 * 100" | bc 
66.00 

o, en su caso específico:

> export ach_gs=2 
> export ach_gs_max=3 
> x=$(echo "scale = 2; $ach_gs * 100/$ach_gs_max" | bc) 
> echo $x 
66.66 

Sea cual sea el método que elija, esto es madura para su inclusión como una función para hacer su vida más fácil:

#!/bin/bash 
function pct() { 
    echo "scale = $3; $1 * 100/$2" | bc 
} 

x=$(pct 2 3 2) ; echo $x # gives 66.66 
x=$(pct 1 6 0) ; echo $x # gives 16 
+0

pero quiero hacer esto en script, la línea completa es: $ ach_gs/$ ach_gs_max * 100 – lauriys

+0

¿Algo menos complicado? – lauriys

+0

no más complicado, más fácil de recordar! – lauriys

6

solo lo hacen en awk

# awk 'BEGIN{print 20/30 * 100}' 
66.6667 

Guardar en variable

# result=$(awk 'BEGIN{print 20/30 * 100}') 
# echo $result 
66.6667 
+0

awk es el mejor. – stu

+1

Esta respuesta es muy incómoda. – xdhmoore

13

Yo generalmente uso Perl:

perl -e 'print 10/3' 
+0

debe ser un problema de perl muy básico, pero este comando solo muestra una línea en blanco en mi sistema. 'perl -e 'print" hello world "'' tampoco funciona. Pero 'perl -e 'print" hello world \ n "'' funciona como se esperaba. –

+2

Me temo que no puedo ayudar. Todo lo que puedo sugerir es agregar '," \ n "' al final de la expresión: 'perl -e 'print 10/3," \ n "'' – pgl

+0

Gracias, esta solución funciona. (y su comando funciona 'tal cual' en otro entorno Linux) –

2
> echo "20/30 * 100" | bc -l 
66.66666666666666666600 

Esta es una simplificación de la respuesta por paxdiablo. El -l establece la escala (número de dígitos después del decimal) en 20. También carga una biblioteca matemática con funciones trigonométricas y otras cosas.

Cuestiones relacionadas