首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash语句中使用bc?

如何在bash语句中使用bc?
EN

Stack Overflow用户
提问于 2015-04-10 04:54:45
回答 3查看 7.4K关注 0票数 3

我试图使用bc来比较if语句中的小数值。我不确定我是否在我的if statement中正确地使用bc,因为它似乎不起作用。它总是进入第4 if statement "IF4“。其他条件看上去不正确吗?

代码语言:javascript
复制
 #SET INITIAL SPEED
initialspeed() {

wpm=0
echo wpm: $wpm
#CHECKS IF SPEED WAS GIVEN
if [ -z "$wpm" ]
then
        let wpm=0.6
        echo IF1 wpm: $wpm #DEBUG
#CHECK IF SPEED IS VALID
elif [ 'echo "if$($wpm > 0.6)1;if$($wpm<=0.6)0" | bc' = 1 ]
then
        echo IF2 wpm: $wpm #DEBUG
        echo Error speed is less than 100 wpm
        exit 3
elif [ 'echo "if$($wpm < 0.06)1;if$($wpm<=0.06)0" | bc' = 1 ]
then
        echo IF3 wpm: $wpm #DEBUG
        echo Error speed is more than 1000 wpm
exit 3
else
        wpm=$(echo "scale=2;60/$2 | bc")
        echo IF4 wpm: $wpm #DEBUG
fi
}

编辑:我实际上是在尝试写一个类似于"spritz“速度阅读器的脚本。$1是要读取的文件,$2是显示在屏幕上的单词的速度。$2是一个可选的参数,如果它没有给我设定一个默认的速度。

给定的速度应在100至1000 wpm之间(计算前为0.6至0.06 )。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-10 05:04:17

您正在尝试使用进程替换,但是您有单引号而不是回退。单引号中的文本只是对Bash的一个文字字符串。你在找后背:

代码语言:javascript
复制
if [ `command` = "result" ]; then  # notice `command` vs 'command'

但最受欢迎的现代语法是

代码语言:javascript
复制
if [ $(command) = "result" ]; then

但这仍然是相当复杂的--通常,你想要的是

代码语言:javascript
复制
if command; then

在这里,command可能是一件比原来稍微复杂一些的事情。

在这种情况下,我将用一个简单的Awk脚本来包装您的逻辑。

您应该使用wpm值来调用它;如果缺少,则会提供默认的0.6。

代码语言:javascript
复制
initialspeed() {
    local wpm
    wpm=${1:-0.6}
    echo "wpm: $wpm" >&2 # notice quoting
    echo "$wpm" | awk '$1 > 0.6 {
            print "Error: speed $1 is less than 100 wpm" >"/dev/stderr"; exit 3 }
        $1 < 0.06 {  # You had < 0.06 vs <= 0.06 but I guess this is what you meant
            print "Error: speed $1 is more than 1000 wpm" >"/dev/stderr"; exit 3 }
        { printf "%2.2f\n", 60/$1 }'
}

您的原始脚本显然对值0.06有错误的比较。现在来看一下,我猜您实际上希望值在0.06到0.6之间,包括在内;但是无论如何,这只是一个草图供您使用。

票数 3
EN

Stack Overflow用户

发布于 2015-04-10 07:37:35

您可以将您的测试输入bc

代码语言:javascript
复制
echo "$wpm > 0.06" | bc

测试结果是可能的

代码语言:javascript
复制
if [ $(echo "$wpm > 0.06" | bc) -eq 1 ]; then
    echo "You are going to fast"
else
    echo "Slow"
fi
票数 5
EN

Stack Overflow用户

发布于 2015-04-10 05:05:58

如果您打算根据wpm值返回0或1,则需要这样的内容

代码语言:javascript
复制
echo "if ( $wpm > 0.6 ) 1 else 0" | bc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29553678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档