여기서 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작은따옴표로 묶인 문자열로 제공됩니다. 이는 PATTERN쉘 변수의 값이 문자열에서 확장되지 않음을 의미합니다. 대신 "$PATTERN".

또한 Stéphane Chazelas가 질문 자체에 대한 의견에서 지적했듯이 모든 변수 확장을 큰따옴표로 묶어야 합니다. 바라보다"bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험"

변수 사용도 일관성이 없습니다 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틀림없이 이는 산술 비교를 입력하고 읽는 것을 더 쉽게 만듭니다.

관련 정보