如何在bash while循环条件语句中使用bc?

时间:2017-03-27 03:04:48

标签: bash shell while-loop conditional-statements bc

我正在编写应该是一个简单的bash脚本来计算公式C = 1-(p ^ n)中需要的最小值p。 C和p由用户输入,是浮点数。

例如,如果C = 0.36且p = 0.8,那么我的程序应该返回2作为n的值,因为1-(0.8 ^ 2)= 0.36

我的代码如下。请注意:我已将|bc放在我的while循环条件语句中的许多不同位置,并且每次出现错误时。正如你所看到的,我试过的最后一个地方是两个右括号之间。

我收到以下错误:

  预期

操作数(错误标记为“.36”)

#!/bash/bin

echo "Enter I/O fraction time:"
read ioINPUT
echo "Enter expect CPU utilization:"
read uINPUT
n=1

function cpuUTIL {
    x='scale=3; 1-$ioINPUT**$n'|bc
}

while [[ cpuUTIL -lt $uINPUT ]|bc]; do
    n+=1
    x='scale=3; 1-$ioINPUT**$n'|bc
done
echo $c

如何在循环条件语句中在bash脚本中正确使用bc?

3 个答案:

答案 0 :(得分:2)

评论中指出了一些问题。以下是您尝试的修复版本:

#!/bin/bash

cpuUTIL () {
    bc <<< "scale = 3; 1 - $ioINPUT ^ $n"
}

read -p "Enter I/O fraction time: " ioINPUT
read -p "Enter expect CPU utilization: " uINPUT
n=1

while (( $(bc <<< "$(cpuUTIL) < $uINPUT") )); do
    (( ++n ))
    x=$(bc <<< "scale = 3; 1 - $ioINPUT ^ $n")
done

echo $x

评论:

  • #!/bin/bash,而不是#!/bash/bin
  • echoread可以缩短为read -p
  • function cpuUTIL的可移植性低于cpuUTIL ()
  • 单引号可防止参数扩展;你必须为你的bc命令使用双引号
  • 我用here-strings(<<<)而不是管道来避免创建子shell
  • bc中的“权力”是^而不是**
  • while条件很复杂:在(( ))中使用嵌套命令替换,它将bc语句的输出(如果比较成立则为1,如果不相应则为0)转换为true /对于Bash来说是假的
  • n+=1将字符串1附加到变量n的内容中(除非它被声明为带declare -i的整数,但这很奇特),所以你有使用类似算术上下文的内容(( ++n ))
  • 最终陈述应该是echo $x

但是,如karakfa's answer所示,您可以直接执行此操作。在bc中,它看起来像这样:

$ p=0.8
$ C=0.36
$ bc -l <<< "scale = 3; l(1-$C) / l($p)"
2.000

bc -l定义数学库,其中包含(在其他几个中)自然对数l(x)

答案 1 :(得分:1)

你可以迭代并找到一个值,但为什么呢?这是一个更好的方法

awk -v p=0.8 -v C=0.36 'BEGIN{print log(1-C)/log(p)}'

此值也是,通常浮点数,你可以通过用[{1}}

包装对数比来获得最低限度

答案 2 :(得分:0)

使用 GNU bc

#!/usr/bin/bc -ql
scale=3
print "Enter I/O fraction time: "
p=read()
print "Enter expected CPU utilization: "
c=read()
l(1-c)/l(p)
quit

将上述内容保存到foo.bc,然后运行chmod +x foo.bc,然后使用./foo.bc执行。

或者没有提示,来自bash

bc -l <<< "p=0.8;c=0.36;scale=3;l(1-c)/l(p)"
相关问题