2015-01-29 4 views
1

я написал следующий скрипт:Прекратить Bash сценария зависит от централизованного выхода

#!/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 

в начале и в конце цикла; сначала устанавливая его на переменную, а затем проверяя, не увеличилось ли оно, а затем привело к преждевременному завершению инструкции, если TP53.lst не был добавлен. Я уверен, что это может сработать, но это неудобно, и я подозреваю, что есть гораздо более простой способ изменить сценарий оболочки.

Еще один способ, которым я могу это сделать, - это передать вывод Optimize_Panel.pl во временный файл, а затем проверить, был ли этот файл пустым.

Любые идеи?

+0

ли это выход с успехом кодов возврата/отказа или выхода отличаются только печатает ли это или нет? –

+0

bash проверяет статус выхода последней команды с 'if [$? -eq 0] 'после этого просто' то пусть counter = counter + 1 else exit' ... * и т. д. * @ rici - отличный подход, хотя - таким образом вам не нужно беспокоиться о касании скриптов. –

ответ

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 
2

Простой хак (в случае, если сценарий Perl не дает статус значимого выхода):

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

grep . соответствует любой непустой строке, так что это способ удаления пустых строк. Но это также способ определить, были ли какие-либо непустые строки; он потерпит неудачу точно в том случае, если их не было. Конечно, было бы намного лучше, если бы perl-скрипт предоставил соответствующий код статуса выхода (0 для успеха, ненулевое значение для отказа), и в этом случае вы могли бы отказаться от взлома | grep ..)

Кстати, вы можете использовать арифметические Баш для заявления, чтобы сделать ваш скрипт, возможно, более удобным для чтения:

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 
+0

Очень приятно - это программирование оболочки, поэтому я не думаю, что это «взломать» ... кроме как в смысле «простого быстрого правильного способа сделать это». ++ –

Смежные вопросы