繁体   English   中英

在 shell 脚本中正确使用 bc 吗?

[英]Correct usage of bc in a shell script?

我只是想用 bc 乘以一些浮点变量:

#!/bin/bash

a=2.77 | bc
b=2.0  | bc

for cc in $(seq 0. 0.001 0.02)
do
    c=${cc} | bc
    d=$((a * b * c)) | bc
    echo "$d" | bc
done

这并没有给我一个输出。 我知道这是一个愚蠢的方法,但我尝试了多种 bc 组合(在不同的地方等)都无济于事。

任何帮助将不胜感激!

bc是一个命令行实用程序,而不是 shell 语法中一些晦涩难懂的部分。 该实用程序从其标准输入读取数学表达式并将值打印到其标准输出。 由于它不是 shell 的一部分,因此它无法访问 shell 变量。

shell 管道运算符 ( | ) 将一个 shell 命令的标准输出连接到另一个 shell 命令的标准输入。 例如,您可以使用管道左侧的echo实用程序向bc发送一个表达式:

echo 2+2 | bc

这将打印 4,因为这里没有更多的东西。

所以我想你想这样做:

a=2.77
b=2.0
for c in $(seq 0. 0.001 0.02); do
  echo "$a * $b * $c" | bc
done

注意:shell 变量的扩展发生在 shell 处理echo的参数时,因为您可以通过bc来验证:

a=2.77
b=2.0
for c in $(seq 0. 0.001 0.02); do
  echo -n "$a * $b * $c" =
  echo "$a * $b * $c" | bc
done

所以bc只看到数字。

如果您想将bc的输出保存在一个变量中而不是将其发送到标准输出(即控制台),您可以使用正常的命令替换语法来实现:

a=2.77
b=2.0
for c in $(seq 0. 0.001 0.02); do
  d=$(echo "$a * $b * $c" | bc)
  echo "$d"
done

直接将两个数字相乘,您可以执行以下操作:

echo 2.77 * 2.0 | bc

它将产生 2 个位置的结果 - 因子的最大数量。 要让它到达更多的地方,比如 5 个,需要:

echo "scale = 5; 2.77 * 2.0" | bc

如果您将每个都有大量小数位的数字相乘,这将变得更加重要。

如其他回复所述, bc 不是 bash 的一部分,而是由 bash 运行的命令。 因此,您实际上是直接向命令发送输入 - 这就是您需要 echo 的原因。 如果你把它放在一个文件中(命名为“a”),那么你会运行“bc < a”。 或者,您可以将输入直接放在shell 脚本中,并让命令运行指定的段作为其输入; 像这样:

cat <<EOF
Input
EOF

...带有限定符(例如,您需要将“”写为“\\”)。

控制流构造在 BC 中脱离命令行运行可能会更成问题。 我尝试了以下

echo "scale = 6; a = 2.77; b = 2.0; define f(cc) { auto c, d; c = cc; d = a*b*c; return d; } f(0); f(0.001); f(0.02)" | bc

并出现语法错误(我安装了一个 GNU-BC 版本)。 另一方面,它会在 C-BC 上运行良好

echo "scale = 6; a = 2.77; b = 2.0; define f(cc) { auto c, d; c = cc; d = a * b * c; return d; } f(0); f(0.001); f(0.02)" | cbc

并为您提供预期的结果 - 匹配您引用的示例...列出 6 个位置的数字。

C-BC 在这里(它在操作上是 GNU-BC 和 UNIX BC 的一个大型超集,但不是 100% POSIX 兼容):

https://github.com/RockBrentwood/CBC

语法更接近 C,所以你也可以把它写成

echo "scale = 6, a = 2.77, b = 2.0; define f(cc) { return a * b * cc; } f(0); f(0.001); f(0.02)" | cbc

得到相同的结果。 所以,作为另一个例子,这个

echo "scale = 100; for (x = 0, y = 1; x < 50; y *= ++x); y" | cbc

会给你 50 阶乘。 但是,POSIX 不要求 bc 使用逗号表达式,例如 (x = 0, y = 1),因此它不会在其他 bc 方言中运行,例如 GNU BC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM