문자열을 부동 소수점 값과 비교

문자열을 부동 소수점 값과 비교

나는 다음 코드를 작성했습니다.

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 …

관련 정보