したがって、さまざまなソフトウェアで実行される計算を自動化するスクリプトを作成する必要があります。スクリプト全体が機能し、添付スクリプトの最上位スクリプトがスクリプト全体で機能します。
問題は、最初の計算で計算が機能すると、「Test.FChk」と「run.log」というファイルが印刷されることです。計算に失敗すると、「Test.FChk」ではなく「run.log」のみが印刷されます。だから何が起こっているのか、現在のスクリプトは "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
4つの可能性があります。ファイルaは存在しますが、ファイルbは存在しません。逆に、両方のファイルが存在するか、ファイルが存在しません。最初の可能性のみを制御でき、残りの3つは制御できません。しかし、あなたが言ったように、あなたが何かをしたい場合両方のファイルが存在する、従って制御しなければなりません。
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
解決策は1つ以上が存在するまで実行され続け、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