2014-10-08 118 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