Bash Scripting和bc

时间:2010-02-25 05:50:20

标签: bash scripting sh bc

我正在尝试编写一个bash脚本,我需要做一些浮点数学运算。基本上我想做这样的事情:

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

我遇到的问题是$?倾向于保持echo程序的输出而不是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

我要做的是让它优雅地退出。

3 个答案:

答案 0 :(得分:8)

我没有看到任何错误。 $ 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

答案 1 :(得分:2)

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

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

答案 2 :(得分: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