0

所以我有一个直到循环,然后我一旦满足直到循环的条件,我希望循环停止并继续沿命令行向下。我使用 PBS 提交了一些作业(也写入脚本)。.com 文件是输入,.log 是输出。目前,调用每个文件的数量彼此相等并因此结束循环似乎存在问题。

$direct 设置为工作目录

我从几个观察中知道这一点:

1)我在超级计算机上查看时睡眠过程仍在运行

2)当我检查队列时,所有作业都已完成

3)在脚本的后面,我要求它发送一封电子邮件,但这并没有发生

这是我第一次使用 until 循环和 sleep 命令,所以我想知道我的语法是否有问题。如果我无法解决这个直到循环,理论上我可以用 if/then 循环做同样的事情,但从我所看到的情况来看,直到循环应该更有效。

这是我正在编写的导致我出现问题的代码的一小部分。完成生成 .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
4

1 回答 1

1

“直到”表达式不重复查找命令。相反,它比较先前计算的 $COM 和 $log 的值。听起来您想在每次通过循环时运行 find 命令。我做了一些调整来得到这个演示脚本:

#!/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
于 2019-08-15T18:30:27.593 回答