[英]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.