根据管道输出终止 Bash 脚本
Terminate Bash script dependent on piped output
我编写了以下 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
在循环的开始和结束;首先将它设置为一个变量然后检查它是否增加然后导致它过早 done 声明如果 TP53.lst 没有被追加。我相信这可以工作,但感觉很笨拙,我怀疑有一种更简单的方法来修改 shell 脚本。
我能想到的另一种方法是将 Optimize_Panel.pl 的输出通过管道传输到一个临时文件中,然后以某种方式检查该文件是否为空。
有什么想法吗?
您可以捕获变量中的输出,然后在该变量为零长度时跳出循环。
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
简单破解(如果 perl 脚本没有产生有意义的退出状态):
perl Optimize_Panel.pl TP53.LST T1_endo.maf | grep . >> TP53.lst || break
grep .
匹配任何非空行,因此它是一种删除空行的方法。但它也是一种检测是否有非空行的方法;恰恰在没有的情况下它会失败。当然,如果 perl 脚本提供适当的退出状态代码(0 表示成功;非零表示失败)会好得多,在这种情况下,您可以省略 | grep .
hack。)
顺便说一句,您可以使用 bash 的算术 for 语句使您的脚本可能更具可读性:
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
我编写了以下 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
在循环的开始和结束;首先将它设置为一个变量然后检查它是否增加然后导致它过早 done 声明如果 TP53.lst 没有被追加。我相信这可以工作,但感觉很笨拙,我怀疑有一种更简单的方法来修改 shell 脚本。
我能想到的另一种方法是将 Optimize_Panel.pl 的输出通过管道传输到一个临时文件中,然后以某种方式检查该文件是否为空。
有什么想法吗?
您可以捕获变量中的输出,然后在该变量为零长度时跳出循环。
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
简单破解(如果 perl 脚本没有产生有意义的退出状态):
perl Optimize_Panel.pl TP53.LST T1_endo.maf | grep . >> TP53.lst || break
grep .
匹配任何非空行,因此它是一种删除空行的方法。但它也是一种检测是否有非空行的方法;恰恰在没有的情况下它会失败。当然,如果 perl 脚本提供适当的退出状态代码(0 表示成功;非零表示失败)会好得多,在这种情况下,您可以省略 | grep .
hack。)
顺便说一句,您可以使用 bash 的算术 for 语句使您的脚本可能更具可读性:
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