Bash

這裡的 getopts 或 grep 有什麼問題

  • January 27, 2017
   #!/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_UNKNOWNwithexit而在其他情況下,您echo將它們的值輸出到標準輸出。

另請注意,診斷消息(如果腳本正常執行,則不屬於腳本輸出的錯誤或警告等)理想情況下應輸出到標準錯誤流中。為此,請使用重定向>&2

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

另一件事,這只是一種風格,是bash支持類似的語法

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

(在這種情況下,測試CRIT是不必要的,因為它在前面的if語句中進行了測試)。這可以說使輸入和閱讀算術比較變得更容易。

引用自:https://unix.stackexchange.com/questions/340563