这里的 getopts 或 grep 有什么问题

这里的 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

答案1

的参数grep以单引号字符串形式给出。这意味着 shell 变量PATTERN的值不会在字符串中扩展。而是使用"$PATTERN".

另外,正如 Stéphane Chazelas 在问题本身的评论中指出的那样,您应该对所有变量扩展加双引号。看 ”忘记在 bash/POSIX shell 中引用变量的安全隐患

您对变量的使用也不一致STATE_。在一种情况下,您可以使用$STATE_UNKNOWNwith exit,而在其他情况下,您可以将echo它们的值输出到标准输出。

另请注意,诊断消息(错误或警告等,如果脚本正常运行,则不属于脚本输出的一部分)理想情况下应输出到标准错误流上。为此,请使用重定向>&2

printf 'CRITICAL: The FAIL count is now %d\n' "$COUNT" >&2

另一件事,这只是一个风格的事情,是bash支持类似的语法

if (( COUNT <= CRIT )) && (( COUNT > WARN )); then ...; fi

(在这种情况下,测试CRIT是不必要的,因为它已经在前面的if语句中进行了测试)。可以说,这使得键入和读取算术比较变得更容易。

相关内容