2014-10-08 106 views
1

我無法讓grep在if語句中正常工作。在下面的代碼段中,if-check總是成立(即沒有找到該單詞),並且程序打印NOT FOUND,即使這些單詞已經在〜/ .memory中。

for ((i=0; i<${#aspellwords[*]}; i++)); do 
if [ !$(grep -q "${aspellwords[$i]}" ~/.memory) ]; then 
    words[$i]="${aspellwords[$i]}" 
    printf "\nNOT FOUND\n" 
fi 
done 

然而,當我在的地方前一段的測試以下代碼:

for ((i=0; i<${#aspellwords[*]}; i++)); do 
if grep -q "${aspellwords[$i]}" ~/.memory; then echo FOUND IT; fi 
done 

這工作完全正常,並認爲這個詞沒有任何問題。

那麼第一段代碼有什麼問題?

+0

在感嘆號後面試一下空格,可能有幫助。 – thom 2014-10-08 02:42:48

+2

如果你想測試返回碼,你不需要'[...]'。放下這些。 '[]'不是'if'語法的一部分。 '['是系統中內置的和二進制的shell。它只是退出代碼。 '如果...;然後'測試'...'的返回碼。 – 2014-10-08 02:49:53

+1

'aspellwords'從哪裏來?如果它是一個文件,你希望更像'words =($(grep -Fvxf aspellwordsfile.memory))''如果這些文件已經不是每行一個字的話,可能會有一些改變。 – tripleee 2014-10-08 03:20:17

回答

3

很多事情都是錯誤的第一個片段。如果你想測試返回碼,你不想要[ ... ]。放下這些。

[]不是if語法的一部分(正如您從第二個片段中看到的那樣)。

[是系統中內置的和二進制的shell。它只是退出代碼。 if ...; then測試...的返回碼。

$()是命令替換。它從運行的命令中取代輸出

所以[ !$(grep ...) ]實際評估[ !output_from_grep ][ word ]被解釋爲[ -n word ]每當word非空,這將是真實的。鑑於!永遠不是非空的,永遠是真的。

簡單地說,就像@thom在他的評論中(有點斜線所示),將!否定添加到您的第二個片段中,並在它與grep之間留有空格。

+0

完全解決了這個問題,並且明確地解釋了這是爲什麼。謝謝! – aredscout 2014-10-08 03:20:50

相關問題