2

apacheを監視するためのコードを入手しました。ファイルの名前はですtest.sh。コードを少し変更しました。

私が探していたのは、私がするときです:

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

apacheのテストを行う必要がありますcpu_load。つまり、パラメータを使用してapacheの監視を制御しようとしまし-argたが、機能していないようです。

これを実行すると:

./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

どこで間違いを犯しているのですか?

4

2 に答える 2

7

条件内の変数の1つ(user_argなどwarn_reqifが空である可能性があります。

これを書くためのより良い方法は、変数を引用符で囲むことです(整数として比較したい場合は失敗する可能性があります):

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

または、デフォルト値を指定して、変数がnullまたは未定義の場合、以下のように失敗しないようにすることもできます。

if [ ${user_arg:-0} -ge ${warn_req:-0} -a ${user_arg:-0} -lt ${crit_req:-0} ]
于 2012-09-04T11:03:23.563 に答える
3

POSIX互換性が必要ない場合は、代わりにbashの算術評価コマンドを使用できます。

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

未設定の変数は暗黙的に0値として扱われるため、デフォルト値の展開を使用する必要はありません。

于 2012-09-04T12:49:56.083 に答える