为什么如果grep -q的话,[!$(grep -q)]不起作用?

时间:2014-10-08 02:33:07

标签: linux bash shell unix grep

我无法让grep在if语句中正常工作。在下面的代码段中,if-check始终为true(即找不到单词),程序打印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

它完美无缺,并且没有任何问题地找到了这个词。

那么第一段代码有什么问题?

1 个答案:

答案 0 :(得分:3)

第一个片段有很多问题。

如果您想测试返回代码,则不想要[ ... ]。放弃那些。

[]不属于if语法(正如您从第二个代码段中看到的那样)。

[是您系统上内置的shell和二进制文件。它只是退出返回代码。 if ...; then测试...的返回码。

$()是命令替换。它将替换为运行的命令中的输出

因此,[ !$(grep ...) ]实际上正在评估[ !output_from_grep ][ word ]被解释为[ -n word ],只要word非空,这将是真的。鉴于!永远不是非空的,永远都是真的。

简单地说,正如@thom在他的评论中指出的那样(有点倾斜),将!否定添加到你的第二个片段,并在grep之间留一个空格。