[:-gt:一元运算符预期

时间:2014-07-25 10:19:21

标签: bash

我不会写很多Bash,所以我对如何解决这个问题感到有点难过。我需要检查命令返回的值是否大于x。当它运行时,我得到[: -gt: unary operator expected我无法修复。

这是我的剧本,

#!/bin/sh
ERROR=0
PHPCPDLevel=100

# PHPCPD
echo "PHP CopyPaste Detection (Limit is at least ${PHPCPDLevel}%"
PHPCPD="phpcpd ."
if [[ `echo $PHPCPD | grep "%" | cut -d'.' -f1` -gt "$PHPCPDLevel" ]]
  then
    echo $PHPCPD
    ERROR=1
  else
    echo "... -> Only `echo $PHPCPD | grep "%" | cut -d'.' -f1`%"
fi

echo "Finished!"
exit $ERROR

更新 我想我已经做到了:

#!/bin/sh
ERROR=0
PHPCPDLevel=25

# PHPCPD
echo "PHP CopyPaste Detection (Limit is at most ${PHPCPDLevel}%)"
PHPCPD="phpcpd ."
PERCENTAGE=$($PHPCPD | grep "%" | cut -d'.' -f1)
if [ ${PERCENTAGE} -gt ${PHPCPDLevel} ]
  then
    echo $PHPCPD
    ERROR=1
  else
    echo "Only $PERCENTAGE%"
fi

exit $ERROR

2 个答案:

答案 0 :(得分:5)

请记住[是一个命令。它可能内置在你的shell中,但它仍然是一个命令。它期待一组特定的参数,当它得到它不理解的东西时会给你一个错误。事实上,如果让事情更容易理解,您可以将[ ... ]替换为test ...

例如:

test -gt 34

将返回:

bash: test: -gt: unary operator expected

嗯...同样的错误信息。

当你得到这样的东西时,你应该在shell脚本的问题区域周围使用set -xvset +xvset -xv将打印出要执行的shell命令,然后将显示命令行在 mangled 之后的样子我的意思是插入 by贝壳。

我怀疑你的错误是:

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

${PERCENTAGE}是一个空白值。如果您使用[[ ... ]]代替[ ... ],则不会收到该错误。 [[ ... ]]的解析方式与[ ... ]略有不同,因为它是复合命令。 shell解释是在解析初始命令后完成的,所以如果你错过引号或字符串包含意外字符,它会更宽容。

所以:

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

现在,您将看到设置环境变量的各种命令正在返回的内容,并且可能会看到您不太期待的内容。

答案 1 :(得分:4)

您不能在[[ ... ]]中使用双括号sh。将你的sheebang改为

#!/bin/bash

或更改语法以使用单括号[ ... ]。如果你这样做,别忘了引用表达式中的术语。