2014-10-06 99 views
0

我有一個問題,我無法修復它。這可能是一些語法問題,我已經tryed這麼多的解決方案,但並沒有找出問題..ShellScript 1:[:[:unexpected operator

我用括號tryed ..沒有括號,我仍然得到控制檯上的錯誤:

1: [: [: unexpected operator 

有人可以幫我嗎? 這裏是我的代碼:

if [ [ cmp --silent 1.fsa 1_.fsa ] returns any ]; then 
    echo "Files are different!" 
else 
echo "Files are identical!" 
fi 

通過我想比較兩個文件一個shell腳本里面,如果它們是同我想說的方式:「文件是相同的」 否則我想說:「文件是不同的!」

非常感謝!

+1

BashPitfalls#9是相關的:http://mywiki.wooledge.org/BashPitfalls#if_.5Bgrep_foo_myfile.5D – 2014-10-06 21:35:35

+0

謝謝你的人;) – TiagoM 2014-10-06 21:37:28

回答

3

根本不使用括號。

if cmp -s 1.fsa 1_.fsa; then 
    echo "Files are identical!" 
else 
    echo "Files are different!" 
fi 

[ ]運行一個名爲test的命令。如果您閱讀man test,您會發現它不理解「返回任何」意味着什麼;它也沒有期望看到[傳遞給它。

因此,字面錯誤你有:

[: [: unexpected operator 

[命令(又名測試)抱怨,它不希望傳遞[作爲參數。

+0

好感謝的人,現在我明白了;) 謝謝,真的很感激;) 我是新來的SH lol – TiagoM 2014-10-06 21:33:53

0

好吧,我發現這個解決方案:

if diff file1 file2 >/dev/null ; then 
    echo Same 
else 
    echo Different 
fi 

但有人說什麼是錯我的執行? 感謝;)

+1

使用'cmp'更快,更有記憶效率;使用'diff'可能會起作用,但它絕不是正確的事情。 – 2014-10-06 21:33:19

+0

好吧,我會爲你的其他實現,謝謝你的反饋關於性能的方式;) – TiagoM 2014-10-06 21:34:31

+0

要理解_why_的性能是不同的,順便說一句 - 'cmp -s'不需要計算_how_事​​情是不同的,所以一旦它發現任何差異,它可以立即退出。 (如果文件大小不同,則不需要在內容中查找不匹配,並且可以立即在那裏短路)。最壞的情況是它讀取兩個文件,O(2n)。相比之下,'diff'需要實際讀取兩個文件並計算最短距離路徑以將一個文件轉換爲另一個文件 - 如果存儲器服務於O(n^3)附近的某個位置,則具有最壞情況行爲的算法。 – 2014-10-06 21:42:58