Bash
這裡的 getopts 或 grep 有什麼問題
#!/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
to 的參數以
grep
單引號字元串的形式給出。這意味著 shell 變數PATTERN
的值不會在字元串中擴展。而是使用"$PATTERN"
.此外,正如 Stéphane Chazelas 在對問題本身的評論中指出的那樣,您應該雙引號所有變數擴展。請參閱“忘記在 bash/POSIX shell 中引用變數的安全隱患”
您對
STATE_
變數的使用也不一致。在一種情況下,您使用$STATE_UNKNOWN
withexit
而在其他情況下,您echo
將它們的值輸出到標準輸出。另請注意,診斷消息(如果腳本正常執行,則不屬於腳本輸出的錯誤或警告等)理想情況下應輸出到標準錯誤流中。為此,請使用重定向
>&2
:printf 'CRITICAL: The FAIL count is now %d\n' "$COUNT" >&2
另一件事,這只是一種風格,是
bash
支持類似的語法if (( COUNT <= CRIT )) && (( COUNT > WARN )); then ...; fi
(在這種情況下,測試
CRIT
是不必要的,因為它在前面的if
語句中進行了測試)。這可以說使輸入和閱讀算術比較變得更容易。