【问题标题】:How to use grep in shell with -e option set如何在 shell 中使用 grep 并设置 -e 选项
【发布时间】:2016-12-07 04:49:02
【问题描述】:

在 bash -e 选项中,出现错误后停止执行,并且 grep 命令返回非零状态,以防找不到它正在寻找的模式。 我想在 if 语句中使用 grep,比如

#/bin/bash -e
if [[ `grep str /usr/lib/file.txt` -eq 0 ]]
  //do something
fi

如果我使用 $?获取最后一条命令的语句,然后在最后一条命令之后停止执行,因为 grep 返回非零状态。 一定有办法做到这一点,需要帮助找到它

【问题讨论】:

  • A checked exit -- 即命令的退出状态,它可以是if 条件或短路操作的一部分,例如&&|| -- 被set -e 忽略 -- 如果这不是真的,您将永远无法在启用if 语句的情况下使用它!
  • 您的问题是“如果我使用$? 来获取[the] last 命令的[exit status]”,但您问题中的代码根本没有使用$?。您可能想确保您显示的代码确实代表了您的问题。
  • ...也就是说,在决定使用set -e 之前,您应该考虑阅读BashFAQ #105 并了解其注意事项;这个特性是……相当有争议的,并且长期以来一直存在不兼容的变化,试图修补令人惊讶的极端情况,结果是不同版本的 bash 在启用它的情况下可能会有不同的行为。
  • 阅读 BashFAQ 非常感谢@CharlesDuffy 的所有指导

标签: linux bash shell


【解决方案1】:

就地完成:

#/bin/bash -e
if grep -q str /usr/lib/file.txt; then
    echo "Found str"
else 
    echo "Didn't find str"
fi

注意grep-q--quiet)选项,我们只对退出状态感兴趣。

【讨论】:

  • 如果 grep -q str /usr/lib/file.txt 返回 -1 并且脚本执行在那里停止,则下一条语句不会被执行
  • @user1560339,heemayl 的答案中的代码不会发生这种情况。如果你有这种行为,那么你正在做一些不同的事情。
  • @heemayl,您可能想用实际的 echo "found str"echo "didn't find str" 命令替换您的 cmets,以确保语法在复制/粘贴场景中有效(因为现在这些 cmets 需要为要解析的代码填写)。
  • @CharlesDuffy 完成。
  • @user1560339, ...顺便说一句,当找不到匹配项时返回的是1,而不是-1——退出状态的类型是unsigned char,这意味着唯一可能的值(对于常规退出,而不是信号)在 0 到 255 之间。
【解决方案2】:

两件事。

  1. 你错过了; then

    if [[ `grep str /usr/lib/file.txt` -eq 0 ]]; then
        //do something
        echo Yes
    fi
    
  2. 当我在 bash shell 中尝试它并且存在 str 时,我在屏幕上看到了匹配的行。你可能不希望那样。使用-l 选项(仅返回行数)将grep 输入wc(字数):

    if [[ `grep str /usr/lib/file.txt | wc -l` -eq 0 ]]; then
       //do something
       echo Yes 
    fi
    

【讨论】:

  • 使用{} 按钮或四个空格缩进来格式化多行代码块。反引号用于小于单行的部分。
  • 另一件事是这里的代码不必要地低效:如果file.txt 是几个GB,你在这里的答案将通读整个事情,而the answer by heemayl 将在第一个实例时立即停止找到str;如果在文件的早期找到第一个答案,那么运行时可能会有很大的不同。如果我错过了这个答案的优势(或者,一般来说,有任何特殊原因更喜欢一种方法而不是先前存在的答案中给出的方法),请考虑提出来。
  • 我继续并重新格式化了这个,没有改变内容。不过,您可能会考虑的一项内容更改至少是将 // 样式的 cmets 更改为 # 的(bash 实际识别的)。
猜你喜欢
  • 2015-04-16
  • 2015-05-22
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多