いくつかのLinuxコマンドを実行し、if句で例外をキャッチして結果を出力するスクリプトを作成しました。基本的に、以下の抜粋コードの各変数はコマンドの実行状態を示し、すべてのコマンドが正常に実行されるとスクリプトが正常に終了することを願っています。そうでなければやめたい。スクリプトのテスト中に、意図的に変数(X8など)に対して1の出力でコマンドが失敗するようにしました。この場合、以下は期待どおりに機能しません。スクリプト失敗メッセージの代わりに成功メッセージが表示されます。なぜそうなのか分からない
if [ $X1 != 0 ] && [ $X2 != 0 ] && [ $X3 != 0 ] && [ $X4 != 0 ] && [ $X5 != 0 ] && [ $X6 != 0 ] && [ $X7 != 0 ] && [ $X8 != 0 ];
then echo "script failed"; exit 1;
else echo "success"; fi;
答え1
スクリプトの上部に次を追加します。
trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR
その後、キャッチされないエラーが発生するたびに、スクリプトは上記のメッセージを表示し、無効な終了コードで終了します。エラーに対して終了コード1を使用するには、$?
に変更できます。1
答え2
まず、の略語[
を使用していますtest
。からman test
:
STRING1 != STRING2 the strings are not equal
仕事に間違ったツールを使用しています。あなたに必要なもの
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
第二に、ここでテストするいくつかの条件があります。長いifステートメントを使用する代わりに、Glennがコメントで提案したように、各変数の出力を追加してテストしてみてください。または、各コマンドの出力が存在する場合はすぐに評価してください。終了する場合は、そのコマンドがとにかく出力されるため、他のコマンドを実行する必要はありません。
ループアプローチは次のとおりです。
for i in $X1 $X2 $X3 ;
do
[ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"
ここで重要なのは、すべての変数に対して同じテストを実行し、テストが失敗した場合、スクリプトが「すべてが正常です」部分に到達しないことです。