因此,我有一个“直到”循环,然后,一旦满足“直到”循环的条件,我就希望循环停止并继续执行命令行。我使用PBS(也已写入脚本)提交了一些作业。 .com文件是输入,.log文件是输出。当前,调用每个文件的数量彼此相等,从而结束循环似乎有些问题。
$ direct设置为工作目录
我从几个观察结果中知道这一点:
1)在超级计算机上检查睡眠过程仍在运行
2)当我检查队列时,所有作业都已完成
3)在脚本中,我进一步要求它发送电子邮件,但这不会发生
这是我第一次使用直到循环和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
答案 0 :(得分: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