Команда не выполняется, пока не выполнено условие цикла

Таким образом, у меня есть цикл "до", а затем, когда условия цикла "до" выполняются, я хочу, чтобы цикл остановился и продолжился по командной строке. Я отправляю несколько заданий, используя PBS (также написано в сценарии). Файлы.com являются входными данными, а файлы.log - выходными. В настоящее время кажется, что существует проблема с вызовом числа каждого файла, равного друг другу, и, таким образом, прекращением цикла.

$ direct установлен в рабочий каталог

Я знаю это из нескольких наблюдений:

1) Процесс сна все еще выполняется, когда я проверяю его на суперкомпьютере

2) Все работы завершены, когда я проверяю очередь

3) Далее в скрипте я прошу отправить электронное письмо, а этого не происходит

Я впервые работаю с циклом before и командой sleep, поэтому мне интересно, не ошибся ли я в синтаксисе. Если я не могу решить этот цикл до, я теоретически мог бы сделать то же самое с циклом if / then, но из того, что я видел, цикл to должен быть более эффективным.

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

COM=$(find $direct -maxdepth 1 -type f -name "*.com" -printf x | wc -c)
log=$(find $direct -maxdepth 1 -type f -name "*.log" -printf x | wc -c)

until [[ $COM = $log ]];
do 
    sleep 10 #wait 10 seconds between checking values
done 

pattern="*.out"
files=( $pattern )
grep "Isotropic" "${files[0]}" |tr -s ' ' | cut -d " " -f2 > 001.anmr
grep "Isotropic" "${files[0]}" |tr -s ' ' | cut -d " " -f3 > 000.anmr

1 ответ

Выражение "до" не повторяет команды поиска. Скорее, он сравнивает ранее вычисленные значения $COM и $log. Похоже, вы хотите запускать команды поиска при каждом прохождении цикла. Я сделал несколько настроек, чтобы получить этот демо-скрипт:

#!/usr/bin/env bash
set -x   # remove this debugging setting
direct=${1:?Please provide a directory}

COM="find $direct -maxdepth 1 -type f -name *.com"
log="find $direct -maxdepth 1 -type f -name *.log"

until [[ $($COM | wc -l) = $($log | wc -l) ]];
do
    sleep 10 #wait 10 seconds between checking values
done

echo DONE
Другие вопросы по тегам