我写了下面的代码:
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 …