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

関連情報