我无法让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
它完美无缺,并且没有任何问题地找到了这个词。
那么第一段代码有什么问题?
答案 0 :(得分:3)
第一个片段有很多问题。
如果您想测试返回代码,则不想要[ ... ]
。放弃那些。
[]
不属于if
语法(正如您从第二个代码段中看到的那样)。
[
是您系统上内置的shell和二进制文件。它只是退出返回代码。 if ...; then
测试...
的返回码。
$()
是命令替换。它将替换为运行的命令中的输出。
因此,[ !$(grep ...) ]
实际上正在评估[ !output_from_grep ]
而[ word ]
被解释为[ -n word ]
,只要word
非空,这将是真的。鉴于!
永远不是非空的,永远都是真的。
简单地说,正如@thom在他的评论中指出的那样(有点倾斜),将!
否定添加到你的第二个片段,并在grep
之间留一个空格。