Команда не выполняется, пока не выполнено условие цикла
Таким образом, у меня есть цикл "до", а затем, когда условия цикла "до" выполняются, я хочу, чтобы цикл остановился и продолжился по командной строке. Я отправляю несколько заданий, используя 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