#!/bin/bash
#return codes:
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
if [ $# -lt 4 ]
then
echo "UNKNOWN: Please, Pass Enough Parameters"
exit $STATE_UNKNOWN
fi
while getopts ":w:c:f:p" opt
do
case ${opt} in
w )
WARN=${OPTARG}
;;
c )
CRIT=${OPTARG}
;;
f )
FILE=${OPTARG}
;;
p )
PATTERN=${OPTARG}
;;
esac
done
COUNT=$(tail -50 ${FILE} | grep -c '${PATTERN}')
if [ $? -eq 0 ]
then
if [ ${COUNT} -gt ${CRIT} ]
then
echo "CRITICAL: The FAIL count is now ${COUNT}"
echo $STATE_CRITICAL
elif [ ${COUNT} -le ${CRIT} -a ${COUNT} -ge ${WARN} ]
then
echo "WARNING: The FAIL count is now ${COUNT}"
echo $STATE_WARNING
else
echo "OK: The FAIL count is now ${COUNT}"
echo $STATE_OK
fi
else
echo "CRITICAL: Error while getting the data"
echo $STATE_CRITICAL
fi
답변1
인수는 grep
작은따옴표로 묶인 문자열로 제공됩니다. 이는 PATTERN
쉘 변수의 값이 문자열에서 확장되지 않음을 의미합니다. 대신 "$PATTERN"
.
또한 Stéphane Chazelas가 질문 자체에 대한 의견에서 지적했듯이 모든 변수 확장을 큰따옴표로 묶어야 합니다. 바라보다"bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험"
변수 사용도 일관성이 없습니다 STATE_
. 한 경우에는 $STATE_UNKNOWN
with 를 사용할 수 있고 exit
, 다른 경우에는 echo
해당 값을 표준 출력으로 인쇄할 수 있습니다.
또한 진단 메시지(스크립트가 정상적으로 실행되는 경우 스크립트 출력의 일부가 아닌 오류 또는 경고 등)는 이상적으로 표준 오류 스트림에 출력되어야 합니다. 이렇게 하려면 리디렉션을 사용하세요 >&2
.
printf 'CRITICAL: The FAIL count is now %d\n' "$COUNT" >&2
또 다른 것은, 이것은 단지 스타일일 뿐인데, bash
다음과 같은 구문을 지원하는 것 입니다.
if (( COUNT <= CRIT )) && (( COUNT > WARN )); then ...; fi
(이 경우 이전 문장에서 CRIT
이미 테스트를 하였기 때문에 테스트는 불필요합니다 .) if
틀림없이 이는 산술 비교를 입력하고 읽는 것을 더 쉽게 만듭니다.