在我正在编写的脚本中,我需要一些小数计算,所以我决定使用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
答案 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)