将字符串与浮点数的值进行比较

将字符串与浮点数的值进行比较

我写了下面的代码:

for j in `cat output_10.txt`

do

dri=`echo $j |cut -d':' -f1` 
nu=`echo $j |cut -d':' -f2`
tot=`echo $j |cut -d':' -f3`
fre=`echo $j |cut -d':' -f4`


if [ $fre > 2 ]
                then
                echo "<td align="Center" bgcolor="#81F781"> $fre </td>" >>mailbody.html
                else
                echo "<td align="Center" bgcolor="#B40404"> $fre </td>" >>mailbody.html
fi
done 

其中 fre 的值是从 output_10.txt 文件中读取的,类似于 9.8。问题是,即使 的值小于 2,该else条件也不起作用。$fre我希望如果 的值$fre小于 2,则else条件有效,并且它应该在我的 HTML 页面中显示红色。

截至目前,在这两种情况下,我的 HTML 页面中都显示绿色。

答案1

Bash 无法进行浮点比较。您需要调用另一个工具,这里我展示了bc从 bash 读取输入这里的字符串

使用该read命令从文件行中提取字段,而不是cut多次调用。

您不能在双引号字符串中嵌入双引号而不转义它们。用于printf使引用更容易一些。

#!/bin/bash
while IFS=: read dri nu tot fre rest_of_line; do
    if [[ $(bc <<< "$fre > 2") == "1" ]]; then
        color=81F781
    else
        color=B40404
    fi
    printf '<td align="Center" bgcolor="#%s">%s</td>' $color $fre >>mailbody.html
done <  output_10.txt

答案2

[ $fre > 2 ]

这是[ $fre ]将(空)输出重定向到文件的情况2。请记住,该字符>引入了输出重定向。

使用-gt运算符执行数值比较:[ "$fre" -gt 2 ]。 (顺便,始终在变量替换周围使用双引号除非您明白为什么必须将它们排除在外。) Bash 还有一种[[ … ]]语法,其中>被解析为比较运算符而不是重定向,但该运算符执行字典比较,即它比较字符串,因此9 > 10.

Bash 不支持浮点数。你可以调用外部程序,例如bc。或者,您可以使用一种特殊的方法来比较小数与整数:

fre_int=${fre%.*} # truncate the part after the decimal point
if [ "$fre_int" -ge 2 ] && [ "$fre" != 2 ]; then …

相关内容