在脚本和控制台中使用bc的不同计算结果

时间:2011-02-19 12:40:10

标签: bash bc

在我正在编写的脚本中,我需要一些小数计算,所以我决定使用bc。我不熟悉这个工具,如果这个问题很简单,请原谅我 当我使用控制台并输入时:

  

设置r_m =`echo“scale = 6; $ pd_f * $ d_f *(1 / sqrt(3))+($ fr_numb-1)*($ pd_f * $ d_f *(1 / sqrt(3)) + $ pd_f * $ d_f * 0.5 *(s(3.14159265 * 30/180)/ c(3.14159265 * 30/180)))+ 0.4“| bc -l`

然后echo "$r_m"它给了我: 19.849870
($ pd_f和$ d_f之前分别宣布为1.129和1.126,哦和$ fr_numb = 18)

但是(!)在bash脚本中使用相同的行:

  

r_m =`echo“scale = 6; $ pd_f * $ d_f *(1 / sqrt(3))+($ fr_numb-1)*($ pd_f * $ d_f *(1 / sqrt(3))+ $ pd_f * $ d_f * 0.5 *(s(3.14159265 * 30/180)/ c(3.14159265 * 30/180)))+ 0.4“| bc -l`

给了我: .033022

为什么?

UPDATE 我在=之后用反引号括起来。我之前不知道如何在blockquote中使用它们。

shell是bash 2.05

4 个答案:

答案 0 :(得分:1)

此脚本

#!/bin/bash

pd_f=1.129
d_f=1.126
fr_numb=18

r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

echo $r_m

输出19.849870

GNU bash, Version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.

就像输出是在(bash驱动的)控制台上输入时一样。也许您需要在调用脚本之前导出变量,如果它们没有在其中定义,而只是在周围的shell中?

答案 1 :(得分:1)

我在fr_numb=0时收到结果.033022。

顺便说一下,您的交互式命令显然是在csh中运行的。如果要确保它由Bash运行,您应该确保您的脚本具有以下第一行:

#!/bin/bash

此外,使用一些空格和续行来使您的公式更具可读性。

#!/bin/bash
pd_f=1.129
d_f=1.126
fr_numb=18
fr_numb=0
r_m=$(echo "scale=6; \
    $pd_f*$d_f * (1 / sqrt(3)) + \
    ($fr_numb - 1) * ( \
        $pd_f * $d_f * (1 / sqrt(3)) + \
        $pd_f * $d_f * 0.5 * \
        ( \
            s(3.14159265 * 30 / 180) / c(3.14159265 * 30 / 180) \
        ) \
     ) + \
     0.4 " | bc -l)

顺便说一下,当发布一个问题时,发布变量赋值,这样就可以轻松复制它们,这样你的设置就可以被复制,而不是像散文样式那样“($ pd_f和$ d_f之前分别声明了1.129和1.126,哦和$ fr_numb = 18)“这需要大量编辑才能使用。

答案 2 :(得分:1)

如果在shell中设置了3个变量,例如:

pd_f=1
d_f=2
fr_numb=3

然后运行原始命令:

set r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

然后你最终将$1设置为r_m=5.018798(并且所有其他位置参数都是未定义的)。这是因为在bash和所有其他Bourne shell派生词中,set语句用于调整shell选项或设置位置参数$1$2的含义, ......等(但不是$0)。

如果您没有这三个变量的值,则会得到bc诊断出的语法错误。

特别注意,原始命令不设置变量r_m;只会在C shell或C shell派生中设置变量。 shell变量$r_m完全不受set语句的影响。您在$r_m中看到的结果是您之前的实验变量中遗留下来的任何内容。

另一方面,当你跑:

r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

然后您将分配给变量r_m

答案 3 :(得分:0)

用$()

括起你的命令
r_m=$(echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l)