Bash 스크립트에서 소수점 정수를 비교할 때 오류가 발생했습니다.

Bash 스크립트에서 소수점 정수를 비교할 때 오류가 발생했습니다.

평균 로드가 특정 임계값에 도달하면 Linux 장치에서 작업/경고를 트리거하는 스크립트를 작성하려고 합니다.

스크립트는 다음과 같습니다.

!/bin/bash

load=`echo $(cat /proc/loadavg | awk '{print $2}')`
if [ "$load" -gt 5 ]; then
        echo "foo alert!"
fi

echo "System Load $(cat /proc/loadavg)"

~에 귀속됨helloacm.com여기서 시작하겠습니다.

실행하면 오류가 발생합니다.

./foocheck.sh: line 4: [: 0.03: integer expression expected

이것은 의미가 있습니다. 마침표/소수점을 보고 문자열을 정수와 비교하고 있다고 생각합니다.

이에 대해 제가 찾은 대부분의 솔루션에는 bc -l장치에서 사용할 수 없는 솔루션이 포함되어 있습니다. 를 사용하지 않고 이러한 값을 비교할 수 있는 방법을 찾아야 합니다 bc.

답변1

비교에는 정수 부분만 사용할 수 있습니다.

load=$(awk '{print $2}' /proc/loadavg | cut -d. -f1)

답변2

awk를 사용할 수 있고 awk가 부동 소수점 값을 처리할 수 있으므로 다음을 수행하십시오.

awk '($1>5){print("yes")}'

편집된 스크립트:

#!/bin/bash

load=`echo $(cat /proc/loadavg | awk '{print $2}')`
loadtest=$(echo "$load" | awk '($1>5){print("yes")}')
if [ "$loadtest" = yes ]; then
    echo "foo alert!"
fi

물론 awk를 사용하면 전체 스크립트를 더욱 단순화할 수 있습니다.

아마도:

#!/bin/bash
awk '($2>5){print("foo alert!")}' /proc/loadavg

답변3

set -- $(cat /proc/loadavg)
load=${2/./}
if [ "$load" -ge 500 ]; then
  echo alert
fi

/proc에서 로드 평균을 가져오고 이러한 필드를 기반으로 위치 매개변수를 설정합니다. 두 번째 필드를 잡고 마침표를 제거합니다. 값(현재 숫자)이 500보다 크거나 같으면 경고를 발생시킵니다. 이는 (현재) 부하 평균이 소수점 이하 두 자리까지 표시되는 것을 가정합니다. 감사해요화살더 좋은 방법을 지적해 보세요.

답변4

bash부동 소수점을 수행할 수 없습니다. 다음 대신에 또는을 zsh사용 하십시오 .ksh93yash

#! /bin/zsh -
read ignore load ignore < /proc/loadavg || exit
if ((load > 5)); then
  echo >&2 Alert
fi

awk또는 이미 (불필요한 명령과 함께) 다음을 사용하고 있기 때문입니다 .

#! /bin/sh -
awk '$2 > 5 {print "Alert"}' < /proc/loadavg >&2

또는 sh if생성자에서 필요한 경우:

#! /bin/sh -
if awk '{exit !($2 > 5)}' < /proc/loadavg; then
  echo >&2 Alert
fi

관련 정보