3

スクリプトbashで奇妙な動作をします。while条件がtrueの場合、スクリプトは正しく動作しますが、falseの場合、ループ後のコマンドはまったく実行されず、スクリプトは停止します。ループの後で私のコマンドに中断はありません。どこに問題があるのか​​わかりません!どんな助けでも大歓迎です:)よろしくお願いします。

while  [ expression1 ] || [ expression2 ]  
do
            echo in the loop
            if  [ expression3 ] && [ expression4 ] ;
            then
                    commands..   
                    break;
            fi
            commands..
done
commands..
echo out from the loop

実際のコード:

start_t=`grep Start_t $job_template | awk -F= '{print $2}'`
current_date=`date +%s`
progress_t=`expr $current_date - $start_t`
exec_t=`grep Exec_t $job_template | awk -F= '{print $2}'`

running_state="r"
req_state $job_id # get the state 
xml_state=` grep "job_id=$job_id" $list_job_file | awk '{print $4}'`
while  [ $state = $running_state ] || [ $xml_state = "stoped" ]  
    do
            echo in the loop
            if  [ "$xml_state" = "running" ] && [ $progress_t  -gt $exec_t ] ;
            then
                    kill_job $job_id
                    update_status $job_template "killed"
                    echo The job is killed    
                    break;
            fi

            sleep $sleeping_t

            $req_state  $job_id # to update the state
            echo state $state
            xml_state=` grep "job_id=$job_id" $list_job_file | awk '{print $4}' `
            echo xml_state $xml_state
            start_t=`grep Start_t $job_template | awk -F= '{print $2}'`
            current_date=`date +%s`
            progress_t=`expr $current_date - $start_t`
    done
echo out from the loop
commands..
4

1 に答える 1

2

このスクリプトには多くの間違いがあります:

  • 状態は初期化されていません
  • テストは単一の右括弧で行われるため、シェルの展開を避けるために変数を二重引用符で囲む必要があります
  • req_state は関数またはコマンドのようです。$
  • awk での grep の無駄な使用 :同じことを行いますgrep Start_t $job_template | awk -F= '{print $2}'awk -F= '/Start_t/{print $2}' $job_template
于 2012-10-10T11:15:40.547 に答える