0

在我现在写的脚本中,我需要一些十进制计算,所以我决定使用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

为什么?

更新我将所有内容都=用反引号括起来。我之前不知道如何在 blockquote 中使用它们。

外壳是 bash 2.05

4

4 回答 4

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

于 2011-02-19T17:47:01.620 回答
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 中?

于 2011-02-19T17:11:04.587 回答
1

我在 .033022 时得到结果fr_numb=0

顺便说一句,您的交互式命令显然是在 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)" 需要大量编辑才能使用。

于 2011-02-19T17:21:40.663 回答
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)
于 2011-02-19T12:45:56.313 回答