检查管道grep的输出

时间:2017-01-13 16:55:43

标签: bash grep

我想检查管道传送到另一个命令的grep命令的输出。在我之前的question中,建议使用PIPESTATUS,但现在我发现它并不能完全适用于所有条件。无论grep(匹配或不匹配)的输出是什么,PIPESTATUS都会返回0,这很奇怪。

脚本包含

GF=`grep g09 $INP | cut -d ' ' -f2`
if [ ${PIPESTATUS[0]}  = 1 ]; then

基本上,第一个命令在输入文件中搜索g09。如果它不存在,则PIPESTATUS应为1

现在在bash脚本中起诉set -x,我看到对于包含g09的输入文件,输出为0,对于没有g09的输入,输出仍为0

++ grep g09 tor.sh
++ cut -d ' ' -f2
+ GF=hashe.gjf
+ '[' 0 = 1 ']'

++ grep g09 tor.sh
++ cut -d ' ' -f2
+ GF=
+ '[' 0 = 1 ']'

为什么呢?我该如何解决这个问题?除了PIPESTATUS之外还有其他解决方案吗?

2 个答案:

答案 0 :(得分:3)

  

为什么?

命令替换在子shell中运行。当子shell退出时,其状态的结果将填充PIPESTATUS,覆盖子shell中的内容。

  

我该如何解决?

检查子壳内的PIPESTATUS。

$(grep g09 $INPUT | cut -f2 -d' '; [[ 1 == $PIPESTATUS[0] ]] && { ... })

答案 1 :(得分:2)

对于您的情况,您只需检查通过cut提取的值是否为空。

if [[ -z $GF ]]; then