[: -gt: unary operator expected

后端 未结 2 1607
一整个雨季
一整个雨季 2021-01-14 16:08

I don\'t write a lot of Bash, so I\'m a bit stumped as to how to fix this. I need to check whether a value returned from a command is greater than x. When it ru

相关标签:
2条回答
  • 2021-01-14 16:23

    You can't use double brackets [[ ... ]] in sh. Change your sheebang to

    #!/bin/bash
    

    or change the syntax to use single brackets [ ... ]. Don't forget to quote the terms inside the expression if you do that.

    0 讨论(0)
  • 2021-01-14 16:44

    Remember that [ is a command. It maybe built into your shell, but it's still a command. It is expecting a particular set of parameters, and will give you an error when it gets something it doesn't understand. In fact, you can replace [ ... ] with test ... if that makes things a bit easier to understand:

    For example:

    test -gt 34
    

    Will return:

    bash: test: -gt: unary operator expected
    

    Hmmm... same error message.

    When you get things like this, you should use set -xv and set +xv around the problem area of your shell script. The set -xv will print out the shell command to be executed, and then will show you what the command line looked like after it has been mangled I mean interpolated by the shell.

    I suspect that your error is:

    if [ ${PERCENTAGE} -gt ${PHPCPDLevel} ]
    

    That ${PERCENTAGE} is a blank value. If you use [[ ... ]] instead of [ ... ] you won't get that error. The [[ ... ]] is parsed a bit differently than [ ... ] because it's a compound command. The shell interpolations are done after the initial command is parsed, so it's a bit more forgiving if you miss a quotation mark or strings contain unexpected characters.

    So:

    ERROR=0
    PHPCPDLevel=25
    
    # PHPCPD
    echo "PHP CopyPaste Detection (Limit is at most ${PHPCPDLevel}%)"
    export PS4="\$LINENO: "     # Prints out the line number being executed by debug
    set -xv                     # Turn on debugging
    PHPCPD="phpcpd ."
    PERCENTAGE=$($PHPCPD | grep "%" | cut -d'.' -f1)
    if [[ ${PERCENTAGE} -gt ${PHPCPDLevel} ]]  # Use [[ ... ]] instead of [ .. ]
    then
        echo $PHPCPD
        ERROR=1
    else
        echo "Only $PERCENTAGE%"
    fi
    set +xv                     # Turn off debugging
    
    exit $ERROR
    

    Now, you'll see what the various commands that set environment variables are returning, and possibly see something you didn't quite expect.

    0 讨论(0)
提交回复
热议问题