在bash中将一行中的许多变量相乘和除以

时间:2017-05-10 23:04:37

标签: bash variables math division multiplication

我想知道是否有办法在bash中轻松完成这个表达式:

(2 * a * sqrt(3))/ 2,其中a是我循环的一些变量。有没有办法将这一切都压缩成一个表达式?到目前为止,我做到了这一点:

for a in 1.1 2.2 3.3
do
    sqrt3=$(echo "sqrt (3)" | bc -l)

然后我尝试了很多东西:

my_val = $(echo "(2*${sqrt3}*${a})/2" | bc)

两个表达式:

first = $((2 * sqrt3 * ${a}))
second = $first/2

但是,这些都不起作用。它没有给出错误,但是当我尝试打印表达式时它也不会打印任何内容。如果无法将其压缩成一个表达式,还有办法吗?谢谢!

编辑:现在试试这个 -

for a in 1.1 2.2 3.3
do
     my_val = $(echo bc <<< "scale = 3; 2 * $a * sqrt(3) / 2")

主要问题是它不是作为变量保存的。我也尝试了这个:

 my_val = $(echo "scale = 3; 2 * $a * sqrt(3) / 2" | bc)

1 个答案:

答案 0 :(得分:2)

Shell脚本通过查看单词后面的空格来区分变量赋值与命令调用。

变量赋值中的=符号由空格包围。在shell中,这不是赋值,而是命令调用。

此:

my_val = $(echo "(2*${sqrt3}*${a})/2" | bc)

应改为:

my_val=$(echo "(2*${sqrt3}*${a})/2" | bc)

对于=周围的空格,shell认为my_val是一个命令,=是第一个参数,计算结果是第二个参数。