2010-02-25 201 views
9

我想写一个bash脚本,我需要做一些浮点数学。基本上我想要做这样的事情:Bash脚本和BC

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

我遇到的问题是$?倾向于保存回声程序的输出而不是bc调用。有没有办法将bc程序的输出保存到变量中?

编辑:

感谢您的快速回复。这是查看问题的另一种方法。说我修改剧本一点点,所以它看起来是这样的:

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

当用户输入一个正常的浮点值,它工作正常:

bash script.sh 1.0 

输出:

.1000000000000000000000000 

但是,当用户输入的值不正确时,脚本无法恢复:

bash script.sh 1.0a 

输出:

(standard_in) 1: parse error 

我想要做的就是它正常退出。

回答

6

我没有看到任何错误。 $ NUM应该把你bc命令结果

见:

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

输出

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

另一种方法是使用AWK

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

另一种方法,是在传递给bc之前,请检查“$ 1”。例如

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 

你没有检查$?bc

+0

请记住,'NUM的成功回显是$ NUM'会覆盖$中的值吗?从'$(echo ... | bc)'命令。 – 2010-02-25 06:04:15

+0

是的,谢谢你的纠正。 – ghostdog74 2010-02-25 06:07:01

+0

我在上面澄清了我的帖子。感谢awk的提示。如果我不能上班,我必须检查出来。 – LandonSchropp 2010-02-25 06:48:17

1

你是从BC(你在NUM存储)计算或者从系统调用的状态返回的结果后?

正如我说你计算的$NUM结果:

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

echo "result: ", $NUM 

测试:

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

我试图从系统调用中获取状态返回值。对不起,我应该更加明确。 – LandonSchropp 2010-02-25 06:48:41

2

对于GNU bc,类似的错误 “(standard_in)1:语法错误”在stderr上输出。你可以在变量中捕获它并检查它。

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