#!/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
以单引号字符串形式给出。这意味着 shell 变量PATTERN
的值不会在字符串中扩展。而是使用"$PATTERN"
.
另外,正如 Stéphane Chazelas 在问题本身的评论中指出的那样,您应该对所有变量扩展加双引号。看 ”忘记在 bash/POSIX shell 中引用变量的安全隐患”
您对变量的使用也不一致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
语句中进行了测试)。可以说,这使得键入和读取算术比较变得更容易。