为什么 if [ !$(grep -q) ] 不起作用而 if grep -q 起作用?

2023-12-08

我无法让 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(使用前将#替换为@)

为什么 if [ !$(grep -q) ] 不起作用而 if grep -q 起作用? 的相关文章

随机推荐

  • 使用 php 从非公共 html 文件夹下载文件

    我有许多文件存储在服务器上 但不在 public html 目录中 这个想法是 登录的用户可以下载文件 使用 SESSION 变量来检查他们是否登录 但如果其他人使用他们的计算机 他们就无法在浏览器历史记录中看到直接文件路径 即使他们这样做
  • Gluon Mobile 项目不适用于 gradle 6

    我有一个 Gluon 移动项目 其 build gradle 如下所示 buildscript repositories jcenter google mavenCentral maven url http nexus gluonhq co
  • 如何从 R 中的流式 MapReduce 作业获取文件名?

    我正在流式处理 R mapreduce 作业 并且需要获取文件名 我知道 Hadoop 在当前作业启动之前设置环境变量 并且我可以使用 Sys getenv 访问 R 中的环境变量 我发现 获取流式hadoop程序中的输入文件名 和 Sys
  • 正交船体算法

    我正在尝试找到一种方法来确定直线多边形来自一组整数点 由下图中的红点表示 下图显示了我想要实现的目标 1 我只需要定义直线多边形边界的最小点集 我能找到的大多数船体算法都不满足这个问题的正交性质 例如礼物包装算法 产生以下结果 即not我想
  • 哈斯克尔:记忆化

    在离开多年并忘记一切之后 我正在尝试重新学习 Haskell 但我发现自己仍然感到困惑记忆化 特别是 我正在尝试编写一个程序来生成混乱的数量D n of n对象 原始位置没有任何项目的排列 号码D n 可以递归地定义为D 1 0 D 2 1
  • OpenCV 3.0 线迭代器

    我想使用线迭代器在使用 Python 的 OpenCV 3 0 中 为 Python 构建的 OpenCV 3 0 仍然可用吗 看来网上的答案都指向cv InitLineIterator这是cv模块 我尝试导入此模块 但似乎它不包含在当前版
  • 使用 Kubernetes 部署并通过 Ingress 连接后 SSE 损坏

    我有一个使用 EventStream 的 ReactJS 客户端和一个实现 SSE 的 golang 后端 当我将浏览器连接到在 localhost 上运行的后端时 以及当我的后端在带有端口转发的 k8s 上运行时 一切似乎都正常 一旦我使
  • 在 Java 中使用 XSOM 解析 XSD 架构。如何访问元素和复杂类型

    我在使用 Java 中的 XSOM 解析 XSD 文件时遇到了很多困难 我有两个 XSD 文件 一个定义日历 第二个定义全局类型 我希望能够读取日历文件并确定 日历有 3 个属性 有效的是一个名为 eYN 的 ENUM Cal 是一个字符串
  • 从 Java/ Android 线程返回值

    我的 android 类中有以下线程 如何从线程中获取 err 的值 public int method new Thread new Runnable int err Override public void run err device
  • 使用 @XmlPath 和 jaxb/MOXy 来映射复杂类型

    我有一个深层 XML 结构 其中有许多无意义的包装器 我将其映射到单个 Java 类 使用 XmlPath 映射简单的数据类型就像在公园散步 但是当涉及到实际需要自己的类的类型时 我不太确定如何做到这一点 特别是当这些类型也应该放入列表中时
  • PHP 的字母等效项 is_numeric

    我正在寻找一个与 is numeric 按字母顺序等效的函数 如果字符串中只有字母 则返回 true 否则返回 false PHP 中是否存在内置函数 你要ctype alpha
  • 我的代码中的未知修饰符[重复]

    这个问题在这里已经有答案了 输出错误 未知修饰符 p 你的字符串包含一团糟 这需要转义为 使用时 作为正则表达式分隔符 代替 作为正则表达式分隔符 使用不会出现在字符串中的内容 例如 例如 你must选择有保证的定界字符not出现在 Src
  • jQuery 停止 fadeTo 效果

    我想要的是一种鼠标轨迹效果 当你将鼠标悬停在 div 上或向下时 但是 如果您将鼠标悬停过快几次然后停止 效果就会自行重复 我该如何解决这个问题 我想我需要某种出队的东西 比如动画选项 但对于 fadeTo 功能 有任何想法吗 test m
  • 根据条件连接data.table中的列名[重复]

    这个问题在这里已经有答案了 这就是我的 data table 的样子 最右边的一列PASTE是我想要的专栏 library data table dt lt fread A B C PASTE TRUE FALSE TRUE A C TRU
  • DigitalMicrograph 脚本对象是否可以收到图像 ROI 变化的通知?

    DigitalMicrograph 脚本文档提到了各种类型的 Listener 对象 这些对象可用于向脚本对象通知各种类型的事件 特别是 ImageDisplay 对象对按键侦听器具有显式支持 以便当击键事件针对特定图像显示时可以通知脚本对
  • LC-3 组装两个数字相减

    我对这个问题有疑问 因为我是 LC 3 编程的新手 编写 LC 3 代码 将 R0 中的值减去 R1 中的值 并将结果放入 R5 中 即编写 R5 R0 R1 的汇编代码 假设R1 10 R0为12 根据你的问题 我们可以假设 12 和 1
  • 301重定向以仅删除主页上的查询字符串

    我不知道 htaccess重定向规则 如果用户输入http example com abc 123 or https example com who 123 or https example com xyz 123那么它应该重定向到http
  • C++ 中的前递增比后递增更快 - 正确吗?如果是,为什么呢? [复制]

    这个问题在这里已经有答案了 我听说 C 中的前增量 i 比后增量 i 快一点 真的吗 这又是什么原因呢 后增量通常涉及保留前一个值的副本并添加一些额外的代码 预增量只是完成它的工作并摆脱困境 我通常会预增量 除非语义会改变并且后增量实际上是
  • 现代 Fortran:从后代调用祖先过程

    我开始使用 Modern Fortran 的 OO 功能 并且已经熟悉其他语言的 OO 功能 在 Delphi Object Pascal 中 通常在其重写的后代过程中调用过程的祖先版本 甚至有一个语言语句 继承 允许这样做 我找不到等效的
  • 为什么 if [ !$(grep -q) ] 不起作用而 if grep -q 起作用?

    我无法让 grep 在 if 语句中正常工作 在下面的代码段中 if check 始终为 true 即未找到该单词 并且程序会打印 NOT FOUND 即使该单词已经在 memory 中 for i 0 i lt aspellwords i