2012-02-23 8 views
1

私は結果に応じて最後に実行されたコマンドと分岐の結果をテストする洗練された方法を探しています。私が作ろうとしている構成は、次のとおりです。前のコマンドの結果に応じてテスト&分岐するエレガントな構造

if /bin/true ; then 
    do_stuff 
fi 

これは成功のためにテストしたいときに効果的です。しかし、どうすれば失敗をテストできますか?私は集中的なエラーチェックをやっているときに、私がやりたいことは、こののと同等です:

if ! /bin/true ; then 
    do_error_handling 
fi 

私がこれまでに発見した最良の解決策は、私のスクリプトに2つの単純なマクロを定義することです:

onSuccess() { [[ $? -eq 0 ]]; } 
onError() { [[ $? -ne 0 ]]; } 

それから私はこのようなものを行うことができます。

some_command 
if onError ; then 
    # error handling block 
fi 

しかし、私は私が書くすべてのスクリプトでこれらのマクロを複製する必要はありませんので、私はbashで内蔵のものを使用して、より多くのを好むだろう。

私のこの「問題」は、書くべきコードのスタイルに関するものです。私は反復的にif [ $? -ne 0 ]醜さをエスケープしたい。

+0

これはスタイルに関することです。私がそれらを必要としない場合、完全なif..elseブロックの使用については忘れてください。 –

+0

組み込みのbashコマンドである "true"と "false"があります。/bin/trueを使用すると、特に必要のないサブプロセスが実行されます。 – jordanm

答えて

1

に相当します。私はすでに||を知っていた私はまだそれをブレースと組み合わせることを考えていませんでした。

/bin/false || { 
    echo err handling 
    echo more handling 
} 

または

/bin/true && { 
    echo stuff on success 
    echo more stuff 
} 

この構築物は、if..elseを置き換えることを目的としません。成功OR失敗に関心がある場合にのみ役立ちます。

1

あなたが上に構築したい場合:

if /bin/true ; then 
    do_stuff 
fi 

試してみてください。

if /bin/true ; then # success 
    do_nothing 
else     # failure/error 
    do_stuff 
fi 
1

時には、あなたがこれを使用することができます。

first_command && command_if_true || command_if_false 

は、関連する落とし穴のためthisを参照してください。基本的に:command_if_truefalseを返します。 、

(first_command && command_if_true || /bin/true) || command_if_false 

しかし、それは価値があるかどうか、または簡単なテストよりも良い格好主観的である:ここでは

は、回避策(と思う)です。

+1

ここに真の条件は必要ありません。ユーザーは '||'部分のみを必要とします。 – Benoit

1

基本的には、

if something 
then : 
    # nothing (colon on previous line is a no-op command) 
else 
    abcdef 
endif 

はそれを見つけた

(something || abcdef) 
+0

この構文は、複数の命令を持つブロックを許可しません。 –

関連する問題