【问题标题】:Execute command determined by output of previous one (i.e., only if there was some output)执行由前一个输出确定的命令(即,仅当有一些输出时)
【发布时间】:2011-07-28 07:51:51
【问题描述】:

应该很容易回答:

假设我想执行一个由 Bash 中前一个命令的输出确定的命令:

curl http://website.com 2> /dev/null | grep -i "test" --count | <MY-COMMAND>

我需要什么: &lt;MY-COMMAND&gt; 应该只在 grep 有一些匹配项(至少 1 个)时执行。

我怎样才能做到这一点?

另外,请随意添加匹配的标签,我想不出任何

【问题讨论】:

  • 有人认为这属于 superuser.com(耸耸肩)

标签: bash scripting command-line


【解决方案1】:
curl http://www.google.com 2>/dev/null | grep window -i -c && echo "this is a success"

【讨论】:

    【解决方案2】:
    curl http://website.com 2> /dev/null | grep -i "test" && <MY-COMMAND>
    

    来自 grep 手册页:“如果找到选定的行,则退出状态为 0,否则为 1”

    只有在前一个命令返回退出状态 0 时才会执行 && 之后的命令。

    【讨论】:

    • grep 的-q 选项增加了一些效率
    【解决方案3】:

    您是否需要将 grep 的输出通过管道传输到您的命令?如果你不这样做,答案会更简单。在这种情况下,由于 grep 的返回码只有在找到匹配项时才会成功,因此您可以使用 &amp;&amp;if

    curl http://website.com 2> /dev/null | grep -q -i "test" && <MY-COMMAND>
    
    if curl http://website.com 2> /dev/null | grep -q -i "test"; then
        <MY-COMMAND>
    fi
    

    &amp;&amp; 运算符是执行 if-else 检查的简写方式。它是一个短路操作符,意味着只有在左侧失败时,右侧才会执行。

    如果您需要将输出通过管道传输到您的命令,那么您需要将输出保存到一个临时文件,测试匹配,然后执行您的命令:

    if curl http://website.com 2> /dev/null | grep -i "test" > /tmp/grep.txt; then
        <MY-COMMAND> < /tmp/grep.txt
    fi
    

    【讨论】:

    • 让我指出ifne 是一种替代临时文件的方法。
    【解决方案4】:

    Jeoy Hess 的moreutils 包中的ifne 实用程序(“如果标准输入不为空,则运行程序”)将为您服务。

    对它的描述:

    将运行以下命令的命令 命令当且仅当标准 输入不为空。我经常想要这个 在 crontabs 中,如:

    find . -name core | ifne mail -s "Core files found" root
    

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2012-07-10
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多