ファイルが複数あるかどうかを確認していない場合は、新規作成しますか?

ファイルが複数あるかどうかを確認していない場合は、新規作成しますか?

したがって、さまざまなソフトウェアで実行される計算を自動化するスクリプトを作成する必要があります。スクリプト全体が機能し、添付スクリプトの最上位スクリプトがスクリプト全体で機能します。

問題は、最初の計算で計算が機能すると、「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

関連情報