【发布时间】:2015-09-11 03:02:42
【问题描述】:
我只是想用 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时,您都在运行一个新bc进程。它对之前的bc进程一无所知。 -
a=2.77 | bc也毫无意义(我很惊讶它实际上不是语法错误),因为a=2.77是一个不会为bc创建输出以供读取和操作的赋值。你需要echo就像你在echo "$d" | bc线上一样。 -
@EtanReisner:
a=2.77|bc启动两个子shell,通过管道将第一个的标准输出连接到第二个的标准输入。首先,它将a设置为2.77 并终止,关闭标准输出。其次,从 stdin 读取会产生(几乎)立即 EOF,因此bc什么也不做。结果是非常昂贵的无操作;甚至分配都不会发生在执行的 shell 环境中。但这肯定不是语法错误:“'简单命令'是一系列可选的变量赋值和重定向,以任何顺序,可选后跟单词和重定向”(XCU 2.9.1)跨度> -
@rici 是的,我了解内部发生的事情(就执行的内容而言)。令我惊讶的是,shell 没有及早注意到缺少命令并选择保释(因为这是命令的不同情况,而不是有命令的情况),但这肯定是初始阶段的额外处理,根本没有必要到那时。
-
@EtanReisner:我认为它不会在不违反 posix 的情况下保释。不要求命令具有命令名称(根据我的引用),并且管道只是由管道分隔的一系列命令。所以这是一个有效的管道。 (我为其他可能阅读评论的人提供了精确机制。我知道你理解它:))