POSIX 부동 소수점 비교

POSIX 부동 소수점 비교

레거시 시스템을 사용하여 여기에서 sqlplus를 연결하여 반환 값을 변수에 저장했는데 제대로 작동하지만 a numeric/floating comparison현재로서는 부동 소수점 값과 반환 값을 비교할 때 문제가 0.052 또는 0.0032 또는 정수 값일 수 있습니다. Bash는 float 비교를 지원하지 않으며 POSIX에서는 bc도 지원하지 않습니다.

isubsCount=$( sqlplus -s user/pass <<-EOF
    set pagesize 0;
    set feedback off;
    set verify off;
    set heading off echo off;
    select  to_char((Max(start_time_timestamp+ (2/24))- p.port_statusmoddat), 999.999) Diff
    from  test
    exit;
EOF )


if [ ${isubsCount%.*} -ge 1 ]; then

echo yes

fi

나는 또한 이것을 시도했지만 작동하지 않습니다.

if (( $(echo "$isubsCount >= 1" |bc -l) )); then

echo yes

fi

답변1

이는 awk를 사용하는 모든 UNIX 시스템의 모든 쉘에서 작동합니다.

$ isubsCount=0.052
$ awk -v val="$isubsCount" 'BEGIN{exit !(val >= 1)}'
$ echo $?
1
$ if awk -v val="$isubsCount" 'BEGIN{exit !(val >= 1)}'; then echo "yes"; else echo "no"; fi
no

$ isubsCount=1
$ awk -v val="$isubsCount" 'BEGIN{exit !(val >= 1)}'
$ echo $?
0
$ if awk -v val="$isubsCount" 'BEGIN{exit !(val >= 1)}'; then echo "yes"; else echo "no"; fi
yes

exit !(val >= 1)분명히 동일한 결과를 얻기 위해 종료 문을 to에서 변경할 수 있지만 exit (val < 1)실제로 테스트하려는 것과 반대되는 조건을 작성하지 않고도 원하는 종료 상태를 얻는 방법을 보여 주기 위해 작성했습니다.

관련 정보