4

問題文:-

前のスクリプトが正常に実行されたときにのみ実行したい4つのシェルスクリプトがあります。そして、私は現在このようにそれを実行しています-

./verify-export-realtime.sh

sh -x lca_query.sh

sh -x liv_query.sh

sh -x lqu_query.sh

したがって、前のスクリプトが成功した後に他のスクリプトを実行させるために。私は以下のようなことをする必要がありますか?私が正しいかどうかわかりませんか?何らかの理由でスクリプトが失敗した場合、何らかの理由で失敗として出力され ますよね?

./verify-export-realtime.sh

RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi

sh -x lca_query.sh

RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi

sh -x liv_query.sh

RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi


sh -x lqu_query.sh
4

6 に答える 6

7

シェルは、&&これを正確に行うためのオペレーターを提供します。だからあなたは書くことができます:

./verify-export-realtime.sh && \
sh -x lca_query.sh && \
sh -x liv_query.sh && \
sh -x lqu_query.sh

または、行の継続(\)を削除して、すべてを1行に書き込むこともできます

./verify-export-realtime.sh && sh -x lca_query.sh && sh -x liv_query.sh && sh -x lqu_query.sh

どこまで進んだかを知りたい場合は、変数を設定するだけのコマンドを追加できます。

done=0
./verify-export-realtime.sh && done=1 &&
sh -x lca_query.sh && done=2 &&
sh -x liv_query.sh && done=3 &&
sh -x lqu_query.sh && done=4

最後のの値は$done、正常に完了したコマンドの数を示します。 $?最後に実行されたコマンド(失敗したコマンド)の終了値、または0すべて成功した場合の終了値に設定されます

于 2012-10-15T19:18:10.727 に答える
2

「&&」演算子を使用して、最初に失敗したコマンドがこのチェーンを切断するときに、コマンドラインで(または他のスクリプトから)スクリプトのチェーンを実行するだけです。

$ script1.sh && echo "First done, running the second" && script2.sh && echo "Second done, running the third" && script3.sh && echo "Third done, cool!"

等々。手順の1つが失敗すると、操作は中断されます。

于 2012-10-15T19:19:12.833 に答える
0

そうです。$変数をエコーすることにより、必要に応じてエラーコードを出力することもできます。これらのスクリプトで実際に独自の値を返し、このメインのスクリプトでそれらをチェックすることにより、独自の戻り値コードを作成することもできます。「スクリプトが何らかの理由で失敗した」よりも役立つ場合があります。

于 2012-10-15T19:11:12.437 に答える
0

エラー処理をより柔軟にしたい場合

script1.sh
rc=$?
if [ ${rc} -eq 0 ];then
echo "script1 pass, starting script2"
  script2.sh
  rc=$?
  if [ ${rc} -eq 0 ];then
   echo "script2 pass"
  else
   echo "script2 failed"
  fi
else
 echo "script1 failed"
fi
于 2012-10-15T20:18:03.603 に答える
0

これを行う標準的な方法は、単純なコマンドが失敗した場合にスクリプトを中止させるシェルオプションを追加することです。インタプリタ行を次のように記述します。

#!/bin/sh -e

またはコマンドを追加します:

set -e

cmd1 && cmd2 && cmd3(他のソリューションで述べられているように行うことも一般的です。)

エラーメッセージを印刷しようとしないでください。コマンドは、エラーが発生した場合に終了する前に、関連するエラーメッセージを出力する必要があります。コマンドが適切に動作せず、有用なエラーメッセージが書き込まれない場合は、発生したエラーを推測するのではなく、コマンドを修正する必要があります。エラーメッセージを書く場合は、少なくとも正しい場所に書いてください。エラーはstderrに属します:

echo "Some error occurred" >&2
于 2012-10-15T22:08:13.357 に答える
0

@William Pursellが言ったように、スクリプトは実際に独自のエラーを報告する必要があります。呼び出し元のスクリプトでもエラー報告が必要な場合、それを行う最も簡単な方法は次のようになります。

if ! ./verify-export-realtime.sh; then
    echo "Error running verify-export-realtime.sh; rest of script cancelled." >&2

elif ! sh -x lca_query.sh; then
    echo "Error running lca_query.sh; rest of script cancelled." >&2

elif ! sh -x liv_query.sh; then
    echo "Error running liv_query.sh; rest of script cancelled." >&2

elif ! sh -x lqu_query.sh; then
    echo "Error running lqu_query.sh." >&2
fi
于 2012-10-16T01:54:42.413 に答える