#!/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
に、これは算術比較を入力して読みやすくします。