2012-09-04 117 views
2

我很新的shell腳本和學習它。我得到了監控apache的代碼。該文件的名稱是test.sh。我改了一下代碼。這是什麼意思[:-ge:意外的運算符,在bash中?

我一直在尋找的是,當我這樣做:

./test.sh -H localhost -wr 2 -cr 5 -arg cpu_load 

應該爲它的cpu_load測試Apache。即我試圖用我的-arg參數控制監控apache。

但是,這似乎並沒有工作。

當我運行此:

./test.sh -H localhost -wr 2 -cr 5 -arg cpu_load 

我得到的錯誤:

./test.sh: 282: [: -ge: unexpected operator 
./test.sh: 286: [: -ge: unexpected operator 

下面是代碼的某些部分:

#!/bin/sh 


while test -n "$1"; do 
    case "$1" in 
     --help|-h) 
      print_help 
      exit $ST_UK 
      ;; 
     --version|-v) 
      print_version $PROGNAME $VERSION 
      exit $ST_UK 
      ;; 
     --hostname|-H) 
      hostname=$2 
      shift 
      ;; 
     --port|-P) 
      port=$2 
      shift 
      ;; 
     --timeout|-t) 
      timeout=$2 
      shift 
      ;; 
     --remote-server|-R) 
      remote_srv=1 
      ;; 
     --binary_path|-b) 
      path_binary=$2 
      shift 
      ;; 
     --pid_path|-p) 
      path_pid=$2 
      shift 
      ;; 
     --pid_name|-n) 
      name_pid=$2 
      shift 
      ;; 
     --status-page|-s) 
      status_page=$2 
      shift 
      ;; 
     --secure|-S) 
      secure=1 
      ;; 
     --warning-req|-wr) 
      warn_req=$2 
      shift 
      ;; 
     --critical-req|-cr) 
      crit_req=$2 
      shift 
      ;; 
    --userargument|-arg) 
     user_arg=$3 
     shift 
      ;; 
     *) 
      echo "Unknown argument: $1" 
      print_help 
      exit $ST_UK 
      ;; 
    esac 
    shift 
done 

#other codes 

    if [ ${wclvls_req} = 1 ] 
    then 
     if [ ${user_arg} -ge ${warn_req} -a ${user_arg} -lt ${crit_req} ] 
     then 
      echo "WARNING - ${output} | ${perfdata}" 
      exit $ST_WR 
     elif [ ${user_arg} -ge ${crit_req} ] 
     then 
      echo "CRITICAL - ${output} | ${perfdata}" 
     exit $ST_CR 
     else 
      echo "OK - ${output} | ${perfdata}" 
      exit $ST_OK 
     fi 
    else 
     echo "OK - ${output} | ${perfdata}" 
     exit $ST_OK 
    fi 

fi 

在那裏我做了錯誤?

在此先感謝。

回答

5

if條件中的一個變量(user_argwarn_req等)可能爲空。

更好的編寫方式與引用的變量(如果要比較的整數可能在你的情況下,失敗):

if [ "${user_arg}" -ge "${warn_req}" -a "${user_arg}" -lt "${crit_req}" ] 

或者另一種方式是指定的默認值,這樣,如果變量爲空或未定義如果不會失敗,如下所示。

if [ ${user_arg:-0} -ge ${warn_req:-0} -a ${user_arg:-0} -lt ${crit_req:-0} ] 
3

如果您不需要POSIX兼容,可以使用bash的算術評估命令:

if ((user_arg >= 0 && user_arg < crit_req)); then 

尚未設定的變量將被隱視爲0值,因此使用默認值擴張不必要。