2009-11-23 12 views
10

Hola me gustaría convertir una cadena en un númeroEn el guión shell bash ¿Cómo se convierte una cadena en un número

x="0.80" 

#I would like to convert x to 0.80 to compare like such: 
if[ $x -gt 0.70 ]; then 

echo $x >> you_made_it.txt 

fi 

En este momento tengo la expresión entera de error esperado debido a que estoy tratando de comparar una cuerda.

gracias

+7

0,70 y 0,80, no son números enteros. – ypnos

Respuesta

2

Por alguna razón, esta solución me atrae:

 
if ! echo "$x $y -p" | dc | grep > /dev/null ^-; then 
    echo "$x > $y" 
else 
    echo "$x < $y" 
fi 

Tendrá que estar seguro de que x $ y $ y son válidos (por ejemplo contienen sólo números y cero o uno ' . ') y, dependiendo de la antigüedad de su CC, puede necesitar especificar algo como' 10k 'para obtener reconocer valores no enteros.

2

Bash no entiende los números de punto flotante. Solo entiende enteros.

Puede intensificar a un lenguaje de scripting más poderoso (Perl, Python, Ruby ...) o hacer todos los cálculos a través de bc o similar.

0

El lenguaje bash se caracteriza mejor como un macroprocesador con todas las funciones, por lo que no hay diferencia entre números y cadenas. El problema es que la prueba (1) funciona en enteros.

+0

No del todo cierto. Bourne shell no sabía sobre enteros, pero Bash sí, a través de "tipografía -i". –

1

uso awk

x="0.80" 
y="0.70" 
result=$(awk -vx=$x -vy=$y 'BEGIN{ print x>=y?1:0}') 
if [ "$result" -eq 1 ];then 
    echo "x more than y" 
fi 
+0

Muy cortante. Funciona mejor que bc. Me permitió usar variables, que era un requisito, no números estáticos. Gracias. Simple y claro. ¡Tenía que aprender a usarlo, necesitaba una solución rápida y fácil! ¡Gracias! – jewettg

14

puede utilizar bc

$ echo "0.8 > 0.7" | bc 
1 
$ echo "0.8 < 0.7" | bc 
0 
$ echo ".08 > 0.7" | bc 
0 

por lo tanto, puede comprobar si hay 0 ó 1 en el script.

+0

'bc' es lo que necesitaba. Gracias, ghostdog74! –

+0

'bc <<<"0.8 > 0.7" 'lo hace con menos sobrecarga. – Alfe

1

Si sus valores están garantizados para estar en la misma forma y rango, se puede hacer comparaciones de cadenas:

if [[ $x > 0.70 ]] 
then 
    echo "It's true" 
fi 

Este fallará si x es" 0.8" (sin cero), por ejemplo.

Sin embargo, aunque Bash no entiende los decimales, su construcción printf puede formatearlos. Entonces podrías usar eso para normalizar tus valores.

$ x=.8 
$ x=$(printf %.2 $x) 
$ echo $x 
0.80 
0

Aquí está mi solución simple:

BaseLine=70.0   
if [ $string \> $BaseLine ] 
then 
     echo $string 
else 
     echo "TOO SMALL" 
fi 
Cuestiones relacionadas