2012-09-04 81 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值,因此使用默认值扩张不必要。