这是什么意思[:-ge:意外的运算符,在bash中?

我很新的shell脚本和学习它。 我得到了监控Apache的代码。 该文件的名称是test.sh 我改了一下代码。

我在找的是,当我这样做的时候:

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

它应该testingApache的cpu_load 。 即我试图用我的-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 

我犯了什么错误?

提前致谢。

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} ] 

如果您不需要POSIX兼容性,则可以使用bash的算术评估命令:

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

未设置变量将被隐式视为0值,所以使用默认值扩展是不必要的。