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

Jam*_*mes 3 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
Run Code Online (Sandbox Code Playgroud)

更新: 我想我已经做到了:

#!/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
Run Code Online (Sandbox Code Playgroud)

Dav*_* W. 5

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

例如:

test -gt 34
Run Code Online (Sandbox Code Playgroud)

将返回:

bash: test: -gt: unary operator expected
Run Code Online (Sandbox Code Playgroud)

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

当你得到这样的事情,你应该使用set -xv,并set +xv在你的shell脚本的问题区域.该set -xv会打印出要执行的shell命令,然后会告诉你什么样的命令行看起来像在它已经错位我的意思是插值通过外壳.

我怀疑你的错误是:

if [ ${PERCENTAGE} -gt ${PHPCPDLevel} ]
Run Code Online (Sandbox Code Playgroud)

${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
Run Code Online (Sandbox Code Playgroud)

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