【问题标题】:Bash conditional 'OR' of grep resultsgrep 结果的 Bash 条件“或”
【发布时间】:2017-02-03 10:22:52
【问题描述】:

我正在尝试对 bash 脚本中两个 grep 命令的结果进行条件检查,但我似乎无法像这样将它们组合起来:

if [[ $( stout_cmd1 | grep -q 'check_txt1' ) || ( $( stdout_cmd2 | grep -q 'check_txt2' ) ]] ; then
    //do something here if output of stdout_cmdX contains text check_txtX
fi

因为它总是返回 false。按预期有条件地检查自己工作的命令:

if stdout_cmd1 | grep -q 'check_txt1' ; then

if stdout_cmd2 | grep -q 'check_txt2' ; then

我不知道如何检查其中一个是否正确。如何在条件检查中组合两个标准输出输出?我已经从 grep 调用中删除了 -q 标志,但没有任何效果。

【问题讨论】:

  • 试试这个:if { stout_cmd1 | grep -q 'check_txt1' } || { stdout_cmd2 | grep -q 'check_txt2' }; then

标签: bash if-statement grep stdout


【解决方案1】:

其实你直接使用grepexit-code,要求它静默运行-q

if cmd1 | grep -q "check_txt1" || cmd2 | grep -q "check_txt2"
then
    echo "Your code here!"
fi

【讨论】:

  • 进程替换在这种情况下没有任何好处,只会使您的脚本对其他 shell 的可移植性降低。
  • @TobySpeight:避免分叉管道!恕我直言,为什么您认为它的便携性较差?只要 OP 用bash 标记它,我认为它没有害处。
  • 为什么你认为进程替换的分叉比普通流水线少? AFAICS,需要创建相同数量的进程。而且我通常更喜欢可移植的答案(或至少指出什么是不可移植的),因为除了问题的海报之外,它们对读者的帮助更大。
  • 同意@TobySpeight 关于可移植性的想法(仅适用于“linux”世界,几乎没有变化使其也适用于旧的 unix)和分叉发生,两者都使用相同的分叉进程计数。对其进行性能测试以显示管道和输入重定向之间是否存在真正的区别可能会很有趣。现在,您的回复很好,很有帮助
  • @Inian 进程替换分叉与管道一样多。它们在 while read; do ...; done < <(cmd)cmd | while read; do ...; done 之类的东西中的使用是为了防止 while 循环,否则它可以直接在当前 shell 中执行(这可能会设置一些 shell 变量以供以后使用)而不是在子 shell 中运行。跨度>
【解决方案2】:

[[ 复合命令计算 条件表达式,但您只需要管道的结果。您需要使用|| 将两个管道组合在一个列表中:

if stout_cmd1 | grep -q 'check_txt1' || stdout_cmd2 | grep -q 'check_txt2'
then
    # your code here
fi

来自 Bash 手册:

list 是一个或多个管道的序列,由 ;&&&|| 中的一个运算符分隔,并可选择由 @ 之一终止987654328@、&<newline>
...
AND 和 OR 列表的返回状态是列表中最后执行的命令的退出状态。

演示

#!/bin/sh

for i in 00 01 02 12
do
    if echo "$i" | grep -q '1' || echo "$i" | grep -q '2'
    then
        echo "$i contains a 1 or 2"
    else
        echo "$i contains neither 1 nor 2"
    fi
done

这会产生以下输出:

00 contains neither 1 nor 2
01 contains a 1 or 2
02 contains a 1 or 2
12 contains a 1 or 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2017-06-17
    • 1970-01-01
    • 2018-01-25
    • 2020-07-19
    • 2022-11-25
    相关资源
    最近更新 更多