2014-05-06 99 views
1

在命令行上,用在兩個文件不同,命令檢查DIFF退出狀態在腳本

echo $? 

報告回差異後「1」。當我嘗試在腳本中相同,具體如下:

echo "` diff $F1 $F2`" 
rv=$? 
if [[ $rv == 1 ]] 
then  
    echo "failed"  
fi   

然後我從來不打印「失敗」(即使是不同的文件)。請注意,這是bash shell的,所以語法應該罰款(例如,如果我檢查「0」代替,它總是打印)。

我如何檢查是否diff命令上發現差異和工藝條件?

這是Ubuntu的12.04下方。

+0

使用'cmp',而不是'diff'如果你只關心數量在返回代碼。 – RedX

+2

和'回聲$(DIFF)'返回從'echo'退出代碼,而不是從'diff'。 – RedX

+0

@RedX:你的第二個評論回答了爲什麼它不起作用,謝謝。但我想首先打印差異,但也要記錄多少次比較失敗。你看到一個簡單的方法來做到這一點? – gnometorule

回答

2

您可能想要這樣做。

echo "`diff $F1 $F2`" 
diff $F1 $F2 > /dev/null 2>&1 
rv=$? 
... 

因爲$?是由echo成功執行被置爲0。

如果你不想跑兩次diff你能做到這一點太..

diff $F1 $F2 > /tmp/thediff 2>&1 
    if [ $? != 0 ] 
    then 
     cat /tmp/thediff 
    fi 
+1

您運行diff兩次 – ceving

+1

只需刪除''' –

+0

@ꜱᴀᴍᴏᴛʜ然後回顯將不打印結果 – ceving

3

這似乎是因爲,在你的腳本,$?是你echo線的返回狀態(不是以前的程序),和回聲可能會一直工作,並返回0

4

你沒有看到從diff的返回值,因爲最後一個命令運行實際上是echo和你」重新看到它的回報價值。你應該能夠實現與下面的代碼所需的效果(捕捉,然後呼應的diff輸出是不必要的 - 只是讓它寫到標準輸出):

diff $F1 $F2 
rv=$? 
if [[ $rv == 1 ]] 
then  
    echo "failed"  
fi 

另外,還要注意diff返回一個值大於一個誤差(0表示相同的文件,1表示不同的文件)。您可能需要檢查並處理該案件。

+1

謝謝,但我還需要打印差異;所以@RedCricket的回答正是我所需要的。 – gnometorule

+2

'echo'\'cmd \'''構造是毫無意義的。你正在捕獲'cmd'寫入'stdout'的內容,並立即將其寫入'stdout'。正如所寫的,它不會完成任何操作(除非 - 如您發現的那樣 - 無法獲得'cmd'的返回值)。 –

+0

@RedCricket同意,儘管RedX的答案也有(部分地)解決計數差異要求的優點。你可以通過更新你的答案來解決這個問題,用一個指向這個(也是RedX的)答案的序言。 – mklement0

5

從您的評論:

但我想,首先打印的差異,也跟蹤了許多比較如何失敗。

我不知道diff是否輸出退出代碼中差異的數量。我想不是。但是,你可以指望,也許行......

這裏是你如何保存退出代碼和計數不同的線路

var=$(diff "$F1" "$F2") 
#store diff exit code 
exit_code=$? 
# remember that this is not the same as count of differences 
lines_output_by_diff=$(wc -l <<< "$var") 

echo "$var" 

if (($exit_code == 0)); then 
    echo "same" 
else 
    echo "not same" 
fi 
+0

非常好!這比我想要的還要多。差異是二元的(正如你可能知道的):1 - 差異,0 - 無。 – gnometorule

+2

@gnometorule:如果用'grep -c'^ [0-9]'替換'wc -l',你會得到實際的_difference count_。 – mklement0