2016-05-05 1 views
2

私はanswering a questionだったと

if [ $(command) ]; then ... 

は常に

if command; then ... 

と同等であると仮定しかし、私はa couple of counter examplesを得た:

$ [ $(true) ] && echo "yes" || echo "no" 
no 
$ if true; then echo "yes"; else echo "no"; fi 
yes 

そして:

$ if echo "$xxxx"; then echo "yes"; else echo "no"; fi 

yes 
$ [ $(echo "$xxx") ] && echo "yes" || echo "no" 
no 

何も返さない、両方のケースで問題がtrueecho $xxxx(未設定の変数)にあり、そのリターンコードが0であり、したがって、if条件がTrueに評価されてecho $xxxxが成功したのに対し、そう[ ]は、(by definition in man test)Falseに評価されます。

しかし、私は疑問に思っています。いつ両方のチェックが同等であると仮定できるでしょうか?これは想定するのが危険なことか、ほとんどの場合信頼性がありますか?

答えて

4

2つのステートメントは全く異なります。あなたが書くとき

if command; then ... 

あなたはコマンドの終了コードをテストしています。ゼロの場合、ブロックが実行されます。一方、ときに

if [ $(command) ]; then ... 

を書きますが、実際にテストしている場合、コマンドの出力ではなく、終了コード。

リンクされた例が動作する理由は、grepが一致するものを見つけた場合にのみ標準出力に出力するためです。

+0

'[$(command)]'の場合はそれよりも悪いです。出力が1つの単語(引用符で囲まれていない場合)と出力が '['/'test'の引数のように見えない場合にのみ、確実に動作します。 '[$(printf - 'a = a')];を比較してください。 echo $? 'を' [$(printf - 'a = b')]に変換します。エコー$? 'などです。 –

4

多くは rarerと同等であると言います。 ifは、実行されたコマンドの戻りコードをチェックします(0は成功/真、それ以外は何も失敗/偽)、そしてstdoutで生成される出力(これは[ "$(...)" ]が検索するもの)と0の戻り値コード。