Я написал следующий сценарий оболочки:
#!/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 печатает одну строку, если цикл должен продолжаться, или завершает работу без печати, если цикл должен остановиться. Я хочу, чтобы цикл while завершался, если Optimize_Panel.pl закрывается вместо печати... но как?
Одно из возможных решений, которое я могу себе представить, - запустить
wc TP53.lst
в начале и конце цикла; сначала установив его в переменную, затем проверив, увеличилось ли оно, а затем приведя его к преждевременному оператору done, если TP53.lst не был добавлен. Я уверен, что это может сработать, но это кажется неуклюжим, и я подозреваю, что есть гораздо более простой способ изменить сценарий оболочки.
Другой способ, который я могу придумать, - это передать вывод Optimize_Panel.pl во временный файл, а затем каким-то образом проверить, не пуст ли этот файл.
Любые идеи?
if [ $? -eq 0 ]
, после чего простоthen let counter=counter+1 else exit
... etc. Хотя @rici - отличный подход - таким образом вам не нужно беспокоиться о касании скриптов. - person G. Cito   schedule 29.01.2015