【问题标题】:How to use bc in bash if statement?如何在 bash if 语句中使用 bc?
【发布时间】:2015-06-15 17:09:26
【问题描述】:

我正在尝试在 if 语句中使用 bc 将值与小数进行比较。 我不确定我在if statement 中是否正确使用了 bc,因为它似乎不起作用。它总是进入第四个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)

【问题讨论】:

  • 使用支持浮点的shell,比如korn shell。除了 bash 之外,几乎所有语言都支持浮点。

标签: bash if-statement bc


【解决方案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】:

    您正在尝试使用进程替换,但您使用的是单引号而不是反引号。单引号内的文本只是 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 之间,包括 0.06 和 0.6;但无论如何,这只是一个供您使用的草图。

    【讨论】:

    • 好的,谢谢。 awk 示例将不胜感激。我对 awk 一点也不熟悉
    • 我已经更新了一个示例脚本,但是你并没有真正解释你想要做什么,所以它是非常试探性的。
    • 感谢 awk 脚本示例。抱歉缺少文档:/
    • 更新为读取单个参数并对其进行计算
    【解决方案3】:

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

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

    【讨论】:

    • 我返回 1 或 0 只是为了确定 wpm 是否大于或小于特定值,然后将 if 语句与 1 而不是浮点数进行比较
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2017-03-06
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多