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

时间:2015-04-10 04:54:45

标签: bash if-statement bc

我正在尝试使用bc来比较if语句中的小数值。 我不确定我是否在if statement中正确使用bc,因为它似乎不起作用。它总是进入第4 if statementIF4”。它似乎没有正确读取其他条件?

 #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)

3 个答案:

答案 0 :(得分:3)

您正在尝试使用流程替换,但您使用单引号而不是反引号。单引号内的文本只是Bash的文字字符串。你正在寻找反叛:

if [ `command` = "result" ]; then  # notice `command` vs 'command'

但首选的现代语法是

if [ $(command) = "result" ]; then

但这仍然相当令人费解 - 通常,你想要像

这样的东西
if command; then

其中可能command比你原来稍微复杂一些。

在这种特殊情况下,我会将您的逻辑包装在一个简单的Awk脚本中。

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

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之间,包括在内;但无论如何,这只是一个供你工作的草图。

答案 1 :(得分:1)

您可以使用

将测试输入bc
echo "$wpm > 0.06" | bc

使用

测试结果
if [ $(echo "$wpm > 0.06" | bc) -eq 1 ]; then
    echo "You are going to fast"
else
    echo "Slow"
fi

答案 2 :(得分:0)

如果你打算根据wpm值返回0或1,你需要这样的东西

echo "if ( $wpm > 0.6 ) 1 else 0" | bc