2017-01-13 47 views
2

我想检查输出到另一个命令的grep命令的输出。在我之前的question中,PIPESTATUS已经被提出,但是现在我发现它并不适用于所有条件。无论grep(匹配还是不匹配)的输出是什么,PIPESTATUS都会返回0,这很奇怪。检查管道grep的输出

脚本中包含

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之外是否还有其他解决方案?

+0

请粘贴完整的代码。 – codeforester

+0

正如您在'set -x'的输出中看到的那样,它是一个输入文件'tor.sh'。在两个不同的目录中有两个'tor.sh'。完整的代码可能很大,但我会更新帖子 – mahmood

+1

反引号在单独的进程中运行您的命令,这就是为什么环境变量不再可用于您的调用脚本。 –

回答

3

为什么?

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

我该如何解决这个问题?

检查子外壳内的PIPESTATUS。

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

那么{...}包含多行。这就是我没有粘贴完整代码的原因(尽管这是不必要的)。没有简单的方法吗? – mahmood

2

对于您的情况,您可以简单地检查通过cut提取的值是否为空。

if [[ -z $GF ]]; then 
+0

这意味着空或不空? – mahmood

+0

检查是否为空,符合您检查'grep's'退出代码为1的事实。'[[-z $ GF]]'当GF为空(未设置或长度为零)时为真。 – codeforester

+1

不是真的......比PIPESTATUS更简单的方法也可以。 – mahmood