因此,我需要编写一个脚本来自动执行由几个不同软件完成的计算。整体脚本有效,在所附脚本中,顶部脚本在我的整体脚本中有效。
问题是,在第一次计算中,如果计算有效,它会打印出一个名为“Test.FChk”和“run.log”的文件。如果计算失败,则仅打印“run.log”,而不打印“Test.FChk”。所以目前发生的情况是我当前的脚本测试“Test.FChk”,但如果计算失败,它会处于无限循环中,所以我希望脚本测试是否找到 run.log 文件,而不是找到Test.FChk,脚本结束,但如果找到两者,它将继续执行脚本的下一部分,并且在计算进行时,等待创建文件,它会打印出其“正在检查作业状态”
###script that works###
while [ ! -f "Test.FChk" ]
do
echo "Checking job status of Gaussian: $JOBNAME..."
sleep 5
done
###script that doesnt work###
while true; do
if [[ ! -f "Test.FChk" && -f "run.log" ]]; then
echo "Checking job status..."
sleep 5
printf "Calculation failed, script ended"
return
fi
break
done
答案1
有四种可能:文件 a 存在,但文件 b 不存在,反之,两个文件都存在,或者都不存在。你只控制了第一种可能性,却控制不了其他三种。但正如你所说,你想做某事,如果两个文件都存在,所以你必须控制它。
while true; do
if [[ ! -f "Test.FChk" && -f "run.log" ]]; then
echo "Checking job status..."
sleep 5
printf "Calculation failed, script ended"
return
# here you control if both files exist
elif [[ -f "Test.FChk" && -f "run.log" ]]; then
break # break the loop, the next code will continue
fi
### this will just stop the loop at the first iteration!
break ### not something you need
###
done
答案2
该解决方案将持续运行,直到至少存在为止,如果缺少run.log
则退出脚本。Test.FChk
如果两个文件都存在,则脚本将继续。
#!/bin/bash
while true; do
if [ -f "run.log" ]; then
if [ -f "Test.FChk" ]; then
# calculation finished, break loop
break
fi
echo "Calculation failed, exiting." >&2
exit 1
fi
echo "Checking job status..."
sleep 5
done
echo "Calculation successfully finished!"
# do something