Comparando uma string pelo valor de um número flutuante com um número

3

Eu escrevi o código abaixo:

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 

onde o valor de fre está sendo lido do arquivo output_10.txt e é algo como 9.8. O problema é que a condição else não está funcionando mesmo se o valor de $fre for menor que 2. Eu quero, se o valor de $fre for menor que 2, a condição else funcionará e deverá exibir a cor vermelha na minha página HTML.

A partir de agora, a cor verde é exibida na minha página HTML para os dois casos.

    
por user77243 11.07.2014 / 17:49

2 respostas

3

Bash não pode fazer comparações de ponto flutuante. Você precisa chamar outra ferramenta, aqui mostro bc entrada de leitura de uma bash aqui-string .

Use o comando read para extrair os campos das linhas do seu arquivo em vez de chamar cut várias vezes.

Você não pode inserir aspas duplas dentro de uma string entre aspas duplas sem escapar delas. Use printf para tornar a citação um pouco mais fácil.

#!/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
    
por 11.07.2014 / 18:00
0
[ $fre > 2 ]

Isso é [ $fre ] com a saída (vazia) redirecionada para o arquivo 2 . Lembre-se de que o caractere > introduz um redirecionamento de saída.

Use o operador -gt para realizar uma comparação numérica: [ "$fre" -gt 2 ] . (Incidentalmente, sempre usa o dobro aspas em torno das substituições de variáveis a menos que você entenda por que deve deixá-las de fora.) Bash também tem uma sintaxe [[ … ]] em que > é analisado como um operador de comparação e não como um redirecionamento, mas esse operador realiza uma comparação lexicográfica , ou seja, compara strings, então 9 > 10 .

Bash não suporta ponto flutuante. Você pode chamar um programa externo como bc . Alternativamente, você pode usar uma maneira ad hoc de comparar um número decimal com um inteiro:

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