根据管道输出终止Bash脚本

时间:2015-01-29 16:22:02

标签: bash perl shell terminate

我编写了以下shell脚本:

#!/bin/bash


counter=0

while [ $counter -lt 250 ]; do
        perl Cumulative_Percentage.pl TP53.lst T1_endo.maf >> OutFile
        perl Optimize_Panel.pl TP53.LST T1_endo.maf >> TP53.lst 
        let counter=counter+1
done

效果很好。问题是它经常运行的循环多得多。 Perl脚本Optimize_Panel.pl如果循环应该继续则打印一行,如果循环应该停止则不退出而退出。 如果Optimize_Panel.pl退出而不是打印,我希望while循环终止...但是如何?

我能想象的一个可能的解决方案是运行

wc TP53.lst

在循环的开头和结尾;首先将其设置为变量,然后检查是否已增加,然后如果未附加TP53.lst则将其导致过早的完成语句。我相信这可行,但感觉很笨,我怀疑有一种更简单的方法来修改shell脚本。

我能想到的另一种方法是将Optimize_Panel.pl的输出传递到一个临时文件中,然后以某种方式检查该文件是否为空。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以捕获变量中的输出,然后如果该变量为零长度则跳出循环。

while [ $counter -lt 250 ]; do
    perl Cumulative_Percentage.pl TP53.lst T1_endo.maf >> OutFile
    output=$(perl Optimize_Panel.pl TP53.LST T1_endo.maf)
    [ -z "$output" ] && break
    echo "$output" >> TP53.lst 
    let counter=counter+1
done

答案 1 :(得分:2)

简单的黑客攻击(如果perl脚本没有产生有意义的退出状态):

perl Optimize_Panel.pl TP53.LST T1_endo.maf | grep . >> TP53.lst || break

grep .匹配任何非空行,因此它是一种删除空行的方法。但它也是一种检测是否存在非空行的方法;在没有任何东西的情况下,它将完全失败。当然,如果perl脚本提供了适当的退出状态代码(0表示成功;非零表示失败)会更好,在这种情况下,您可以省略| grep . hack。)

顺便说一下,你可以使用bash的arithmetic for statement来使你的脚本更具可读性:

for ((counter=0; counter < 250; ++counter)); do
    perl Cumulative_Percentage.pl TP53.lst T1_endo.maf >> OutFile
    perl Optimize_Panel.pl TP53.LST T1_endo.maf |
      grep . >> TP53.lst || break;
done