シェルスクリプト(条件が期待どおりに機能しない場合)

シェルスクリプト(条件が期待どおりに機能しない場合)

いくつかの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"

ここで重要なのは、すべての変数に対して同じテストを実行し、テストが失敗した場合、スクリプトが「すべてが正常です」部分に到達しないことです。

関連情報