文字列を浮動小数点値と比較

文字列を浮動小数点値と比較

私は次のコードを書いた。

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の値は、9.8と同様にoutput_10.txtファイルから読み取られます。問題は、 のelse値が 2 より小さくても条件が成立しないという点である。値が2未満の場合、条件は有効でHTMLページに赤で表示されることを$fre望みます。$freelse

現時点では、どちらの場合もHTMLページに緑色があります。

答え1

Bashは浮動小数点比較を実行できません。別のツールを呼び出す必要があります。ここでは、bcbashから入力を読むことを示しています。ここにある文字列

複数回呼び出すのではなく、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 …

関連情報