쉘 스크립트에서 부동 소수점 값을 비교하는 방법은 무엇입니까?

쉘 스크립트에서 부동 소수점 값을 비교하는 방법은 무엇입니까?

내 로드 평균이 10을 초과하면 경고를 보내야 합니다.

awk 명령이 정수를 반환하는 경우 다음을 수행할 수 있습니다.

declare -i MAX_LOAD=10

declare -i L1=`cat /proc/loadavg | awk {'print $1'}`

if [ $L1 -gt $MAX_LOAD ]
then
    echo "Alert"
fi

그러나 L1에서는 부동 소수점 값(예: 2.35)을 반환합니다.

이 경우 값을 어떻게 비교할 수 있습니까?

답변1

이미 awk를 사용하고 있으므로 아마도 가장 쉬운 방법은 해당 언어에서도 부동 소수점 비교를 수행하는 것입니다.

MAX_LOAD=10.0
if ! </proc/loadavg awk -vmax_load=$MAX_LOAD '{ exit $1 > max_load }'
then
    echo Alert
fi

!연산자 반전 테스트 와 같은 몇 가지 트릭이 관련되어 있습니다 . 이는 awk의 부울 표현식과 값을 수신하는 상태 코드 구성이 if반대 의미를 갖기 때문에 필요합니다 . 파일을 awk의 표준 입력으로 <보내는 데 사용됩니다 . /proc/loadavgawk를 호출하면 -vmax_load=$MAX_LOAD awk 변수가 max_load쉘 변수의 값으로 설정됩니다 MAX_LOAD.

특정 경우 MAX_LOAD가 정수이고 파일에서 첫 번째 부동 소수점을 읽으므로 임시 해결책은 다음과 같습니다.

if [ $(</proc/loadavg cut -f1 -d.) -gt $MAX_LOAD ] ...

호출은 cut의 첫 번째 숫자의 정수 부분을 추출합니다 /proc/loadavg. 그러나 위의 가정 중 하나라도 잘못된 것으로 판명되면 아이디어는 실패합니다.

관련 정보