我有几个通过管道链接的命令,最后是一个条件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