나는 다음 코드를 작성했습니다.
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
원합니다 .$fre
else
현재로서는 두 경우 모두 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 …