2010-02-25 7 views
9

Estoy tratando de escribir un guión bash y necesitaba hacer algunas matemáticas de coma flotante. Básicamente quiero hacer algo como esto:Bash Scripting ycb

NUM=$(echo "scale=25;$1/10" | bc) 
if [ $? -ne 0 ] 
then 
echo bad 
fi 

El problema que me estoy encontrando es $? tiende a mantener el resultado del programa de eco y no de la llamada bc. ¿Hay alguna forma de guardar el resultado del programa bc en una variable?

EDIT:

Gracias por las respuestas rápidas. Aquí hay otra forma de ver el problema. Digo que he modificado el guión un poco por lo que se ve así:

#!/bin/bash 
NUM=$(echo "scale=25;$1/10" | bc) 
if [ $? -ne 0 ] 
then 
echo bad 
exit 
fi 
echo "$NUM" 

Cuando el usuario introduce un valor de punto flotante normal, que trabaja muy bien:

bash script.sh 1.0 

de salida:

.1000000000000000000000000 

Sin embargo, cuando el usuario introduce un valor incorrecto, la secuencia de comandos no se puede recuperar:

bash script.sh 1.0a 

de salida:

(standard_in) 1: parse error 

Lo que estoy tratando de hacer es conseguir que salir con gracia.

Respuesta

6

No veo nada de malo. $ NUM se supone que debe mantener sus bc resultados del comando

véase:

NUM=$(echo "scale=25;$1/10" | bc) 
echo "\$? is $?" 
echo "NUM is $NUM" 

salida

$ ./shell.sh 10 
$? is 0 
NUM is 1.0000000000000000000000000 

otra manera es usar awk

NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }') 
echo "\$? is $?" 
echo "NUM is $NUM" 

La otra forma, es Haga el cheque de "$ 1" antes de pasar al bc. por ejemplo

shopt -s extglob 
input="$1" 
case "$input" in 
+([0-9.])) 
    IFS="."; set -- $input 
    if [ $# -ne 2 ];then 
     echo "bad decimal" 
    else 
     NUM=$(echo "scale=25;$1/10" | bc ) 
     echo "$NUM" 
    fi 
esac 

que no tienen que comprobar si hay $? de bc más

+0

Recuerde que el eco exitoso de 'NUM is $ NUM' habrá sobrescrito el valor en $? del comando '$ (echo ... | bc)'. –

+0

sí, gracias por la corrección. – ghostdog74

+0

Aclaré mi publicación anterior. Gracias por el consejo sobre awk. Si no puedo hacer que bc funcione, tendré que verificarlo. – LandonSchropp

1

¿Está usted después de que el resultado del cálculo de BC (que almacene en la NUM) o el rendimiento de estado de la llamada al sistema?

Como ya he dicho que tiene el resultado del cálculo en $NUM:

#bctest.sh 
NUM=$(echo "scale=25;$1/10" | bc) 
if [ $? -ne 0 ] 
then 
echo bad 
fi 

echo "result: ", $NUM 

prueba:

bash ./bctest.sh 15 
result: , 1.5000000000000000000000000 
+0

Estaba intentando recuperar el estado de la llamada al sistema. Lo siento, debería haber sido más explícito. – LandonSchropp

2

para GNU bc, un error similar a "(standard_in) 1: error de sintaxis" voluntad salir en stderr. Puedes capturar esto en tu variable y verificarlo.

#!/bin/bash 
NUM=$(echo "scale=25;$1/10" | bc 2>&1) 
if [[ $NUM =~ error || $? -ne 0 ]] 
then 
    echo bad 
    exit 
fi 
echo "$NUM" 
Cuestiones relacionadas