2014-07-25 48 views
2

我不寫很多Bash,所以我有點難以確定如何解決這個問題。我需要檢查從命令返回的值是否大於x。當它運行,雖然我得到[: -gt: unary operator expected,我無法修復。[:-gt:一元運算符預期

這裏是我的腳本,

#!/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

echo $ PHPCPD | grep「%」|切「-d」。 -f1' – anubhava

+0

現在是'5'。 – James

+0

首先執行任何操作並將結果存儲在變量中然後進行比較是很好的。 –

回答

3

請記住[是一個命令。它可能內置在你的shell中,但它仍然是一個命令。它期待着一組特定的參數,並且當它得到一些不理解的東西時會給你一個錯誤。事實上,你可以用test ...替代[ ... ]如果讓事情變得更簡單理解:

例如:

test -gt 34 

返回結果:

bash: test: -gt: unary operator expected 

嗯......同樣的錯誤信息。

當你得到這樣的東西時,你應該圍繞shell腳本的問題區域使用set -xvset +xvset -xv將打印出要執行的shell命令,然後會告訴你命令行看起來像是什麼樣子之後, 被破壞 我的意思是由shell插入

我懷疑你的錯誤是:

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 

,你會看到什麼設置環境變量的各種命令返回,並可能看到的東西你不太期望的。

4

sh不能使用雙括號[[ ... ]]。將您的sheebang更改爲

#!/bin/bash 

或更改語法以使用單個括號[ ... ]。如果你這樣做,不要忘記引用表達式中的術語。

+0

+1我認爲這是原因 – anubhava

+0

我已經改變了它,但它仍然不起作用。我現在只是嘗試一些稍微不同的事情。 – James

+1

@James你也可以'PHPCPD =「phpcpd。」'然後執行'echo $ PHPCPD'。難道你不想運行命令,比如「'phpcpd。| grep ...'? – user000001