grep 可以返回真/假还是有其他方法

Lau*_*ren 194 grep

作为此脚本的一部分,我需要能够检查给定的第一个参数是否与文件的第一个单词匹配。如果是,则退出并显示错误消息;如果没有,请将参数附加到文件中。我了解如何编写if语句,但不了解如何grep在脚本中使用。我知道这grep看起来像这样

grep ^$1 schemas.txt
Run Code Online (Sandbox Code Playgroud)

我觉得这应该比我做的要容易得多。

我在声明中收到错误“参数太多” if。我摆脱了之间的空间grep -q,然后得到了一个预期的错误二元运算符。

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "$@" >> schemas.txt
fi
Run Code Online (Sandbox Code Playgroud)

der*_*ert 285

grep如果找到了一些东西(零)与没有找到任何东西(非零),则返回不同的退出代码。在if语句中,零退出代码映射为“true”,非零退出代码映射为 false。另外,grep 有一个-q参数不输出匹配的文本(而只返回退出状态码)

因此,您可以像这样使用 grep:

if grep -q PATTERN file.txt; then
    echo found
else
    echo not found
fi
Run Code Online (Sandbox Code Playgroud)

快速说明一下,当您执行诸如 之类的操作时if [ -z "$var" ]…,事实证明它[实际上是您正在运行的命令,就像 grep 一样。在我的系统上,它是/usr/bin/[. (好吧,从技术上讲,您的 shell 可能内置了它,但这是一种优化。它的行为就像一个命令一样)。它的工作方式相同,[为真返回零退出代码,为假返回非零退出代码。(test与 相同[,除了结束]

  • @Lauren 您不在 [ 内使用 grep,您可以使用一种或另一种,具体取决于您要检查的条件。(你可以在 if 中使用任何命令,顺便说一句,如果只是检查退出代码。)......好吧,我想你可能会想出一个在 [ 中使用 grep 的理由,但这将是一个相当复杂的脚本,它的这不是一件正常的事情。 (3认同)
  • 仅供参考,运行 `ls -l /usr/bin/\[` 和 `man [` 可以看到 `[` 是一个和其他程序一样的程序,它只是 * 看起来 * 像一个语法元素 - 这应该让它变得更明显和更容易了解。(为方便起见,`[` 也是内置于 bash、dash 和其他 - 但它仍然是一个命令)。也可以在 bash 中尝试 `type -all [`。 (3认同)

ami*_*gal 70

另一种简单的方法是使用grep -c.

输出(不作为退出代码返回),与模式匹配的行数,因此如果不匹配则为 0,如果匹配则为 1 或更多。

因此,如果您想检查模式是否匹配 3 次或更多次,您可以这样做:

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...
Run Code Online (Sandbox Code Playgroud)

  • 更准确地说,如果只找到一次,它将 _output_ 1 。无论找到的匹配数量多少,都要输出 1,请改用 `grep -cim1`。 (26认同)
  • `grep -cim1` 的解释:`-c` 表示打印计数,`-i` 表示不区分大小写(因此,如果您不需要,请删除此选项),`-m` 表示在这么多行之后停止读取匹配。所以它实际上意味着“grep --count --ignore-case --max-count=1”。 (2认同)

小智 11

我知道我迟到了,但我喜欢这个简短的版本:

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
Run Code Online (Sandbox Code Playgroud)