我正在编写应该是一个简单的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?
答案 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
echo
和read
可以缩短为read -p
function cpuUTIL
的可移植性低于cpuUTIL ()
<<<
)而不是管道来避免创建子shell ^
而不是**
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)"