我不会写很多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
答案 0 :(得分:5)
请记住[
是一个命令。它可能内置在你的shell中,但它仍然是一个命令。它期待一组特定的参数,当它得到它不理解的东西时会给你一个错误。事实上,如果让事情更容易理解,您可以将[ ... ]
替换为test ...
:
例如:
test -gt 34
将返回:
bash: test: -gt: unary operator expected
嗯...同样的错误信息。
当你得到这样的东西时,你应该在shell脚本的问题区域周围使用set -xv
和set +xv
。 set -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
或更改语法以使用单括号[ ... ]
。如果你这样做,别忘了引用表达式中的术语。