基于标准输出的 If 条件

基于标准输出的 If 条件

我有几个通过管道链接的命令,最后是一个条件awk:下面的示例

command1 | command 2 | awk '$1 > 800'

现在有时会输出几行,有时则不输出。我想要一个只有在有一些输出(1 行或多行)时才证明为真的条件 有没有办法让它工作?

喜欢,

if command1 | command 2 | awk '$1 > 800' (some output); then
do command3
else; (blank output)
Do nothing

答案1

我通常只使用命令替换,然后将其放入测试中,例如

if [ ! -z "$(command1 | command 2 | awk '$1 > 800')" ]; then command3; fi

解释

  • 这根据您的问题运行命令:command1 | command 2 | awk '$1 > 800'
  • 其输出将传递给测试[ ! -z "$(…)" ],如果它不是!零长度的字符串-z,则测试结果为 true。

因此,如果命令管道有输出,then命令就会运行。

答案2

awk使用语句的正确返回代码使脚本退出if

if command1 | command2 | awk '$1 > 800 { c++; print } END { exit (c == 0) }'
then
   command3
fi

或者,如果你实际上不这样做需要程序的输出awk

if command1 | command2 | awk '$1 > 800 { c++; exit } END { exit (c == 0) }'
then
   command3
fi

答案3

您可以awk打印所需的退出代码,如下所示:

echo 900 | awk '{ print !($1 > 800) }'

(然后可以使用and将其包装在子 shell 中exit,以从 中返回值awk

echo 900 | (exit $(awk '{ print !($1 > 800) }'))

然后可以将其用作管道的一部分:

echo 900 | (exit $(awk '{ print !($1 > 800) }')) && echo yes || echo no

相关内容