我无法让 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
它工作得很好,找到这个词没有任何问题。
那么第一段代码有什么问题呢?
第一个片段有很多问题。
你不想要[ ... ]
如果你想测试返回码。放下那些。
[]
不属于if
语法(正如您从第二个片段中看到的那样)。
[
是系统中内置的 shell 和二进制文件。它只是以返回代码退出。if ...; then
测试返回码...
.
$()
是命令替换。它将自身替换为output从运行的命令。
So [ !$(grep ...) ]
实际上正在评估[ !output_from_grep ]
and [ word ]
被解释为[ -n word ]
每当word
是非空的。鉴于!
永远不会是非空的,永远是真的。
简单地说,正如 @thom 在他的评论中所指出的(有点间接),添加!
对第二个片段的否定,其之间有一个空格grep
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)