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

为什么if 在grep -q时不起作用?

我无法让grep在if语句中正常工作。 在下面的代码段中,if-check总是成立(即没有find该单词),并且程序打印NOT FOUND,即使这些单词已经在〜/ .memory中。

for (( i=0; i<${#aspellwords[*]}; i++)); do if [ !$(grep -q "${aspellwords[$i]}" ~/.memory) ]; then words[$i]="${aspellwords[$i]}" printf "nNOT FOUNDn" fi done

但是,当我testing下面的代码代替以前的段:

for (( i=0; i<${#aspellwords[*]}; i++)); do if grep -q "${aspellwords[$i]}" ~/.memory; then echo FOUND IT; fi done

它工作得很好,发现没有任何问题的话。

那么第一部分代码有什么问题呢?

在背景上运行heredoc格式的脚本?

用shell脚本杀死vim进程会留下.swp文件

在Linux中回收站脚本

当使用bash脚本ssh远程机器时找不到命令

有没有办法在手册页中寻找一个标志?

在shell中导出variables值

检查/ etc / hosts中是否存在IP

如何使用bash将一行文本添加文件的中间?

BASH:“出口k = 1”与“k = 1”之间的差异

Bash脚本继续关键字不断开循环迭代

一个片段有许多错误

如果你想测试返回码,你不想要[ ... ] 放下这些。

[]不是if语法的一部分(正如你可以从你的第二个片段中看到的那样)。

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

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

所以[ !$(grep ...) ]实际上是对[ !output_from_grep ]求值, [ word ]被解释为[ -n word ] ,只要word非空,它就是true。 鉴于此! 从来不是非空的,永远是真的。

就像@thom在他的评论中(有点斜线)所表明的那样,加上! 否定您的第二个片段,它与grep之间的空格。

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

相关推荐