微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 如果grep -q有效,为什么[!$(grep -q)]不起作用?

我无法让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和二进制文件.它只是退出返回代码.如果…;然后测试….的返回码

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

所以[!$(grep …)]实际上正在评估[!output_from_grep],[word]被解释为[-n word],只要word为非空,它就为真.鉴于 !永远不会是非空的永远是真的.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐