Как мне продолжать повторять итерацию в цикле for, если в Bash отображается конкретная ошибка? - PullRequest
0 голосов
/ 04 июня 2019

Я запускаю команду отдельно для нескольких файлов в каталоге, используя скрипт bash, который использует цикл for.Для определенных файлов команда выдает ошибку и переходит к следующему файлу.Я не хочу, чтобы цикл for переместился на следующую итерацию в случае ошибки, скорее я хочу, чтобы он повторил команду для этого конкретного файла.

Я знаю о попытке, кроме функции, найденной в таких языках, какPython, но не уверен, как включить его в мою конкретную проблему в сценариях командной строки / bash.Вот как выглядит код:

for i in $(cat ./listID.txt)
do
    command on file $i
done

Здесь listID.txt содержит все идентификаторы файлов в каталоге, а команда - это конкретное программное обеспечение для биоинформатики, которое я использую.

Ошибкакод «Ошибка, строка 3: пробовал 100000 потенциальных локусов для входа, но не мог избежать исключенных областей. Игнорирование входа и переход».

Я не хочу, чтобы цикл for продолжался, вместо этого продолжайте применять команду к определенному файлу i, пока я не получу указанную выше конкретную ошибку, и только затем переходите к следующей итерации / файлу..

Ответы [ 2 ]

3 голосов
/ 04 июня 2019

Просто выполните команду в цикле while:

for i in ...; do 
    while ! command on file "$i"; do sleep 1; done
done

Режим сна полезен, если ваша команда сразу же перестала работать: это может быть болезненно, если вы позволите ему перезапуститься так быстро, как только сможете.

Учитывая комментарий ниже, вы можете легко изменить это, чтобы проверить конкретное сообщение об ошибке:

for i in ...; do 
    while command on file "$i" 2>&1 |
        grep -q 'Error, line 3: tried 100000 potential loci for entry' 
    do sleep 1; done
done

Это отбрасывает все выходные данные команды, но может быть относительно легко изменено, чтобы сохранить его. (например, while command 2>&1 | awk '/Error msg/{rv=1} 1 END {exit !rv})

0 голосов
/ 04 июня 2019

Поставьте проверку, используя цикл while, чтобы проверять код выхода команды после каждого выполнения, сохраняйте внутренний цикл while, если rc не равен нулю (успех).

while read -r line ;do
    rc=1;
    while [[ $rc -ne 0 ]];
    do
        command on file "$line"
        rc=$?;
        #sleep 1;                       #this is optional, based on your environment
    done
done < ./listID.txt

PS: заменено for loop на while loop. Не очень хорошая практика построчно анализировать файл, используя цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...