多くのshコードは次のようになります。
$ cmd if [$?= 0]; 次に$cmd2; fi
それ以外の:
$cmdの場合; 次に$cmd2; fi
私は通常、後者の構文が有効であることに気付いていないという理由だけで前者を使用すると想定していましたが、別の理由があるのではないかと思います(ただし、頭に浮かぶ唯一の可能性は移植性です)。$ {?}を明示的に参照することを好む理由はありますか?
$?
エラーコードを実際に何か(ログ記録、予想されるエラーの処理など)に使用する場合は、参照する必要があります。あなたが言及している特定のシナリオでは、2番目のif
構成はより明確で短く、使用しない理由はありません。
私の考えでは、多くの人は、コマンドのステータスを多かれ少なかれテストできることに気付いていないからです。同様に、人々はあなたが書くことができることに気づいていません:
if cmd1
cmd2
cmd3
then
...do this after executing cmd1, cmd2 and cmd3, but ...
...only if cmd3 exits with with status 0!
fi
コードを(簡潔さを犠牲にして)単純化して、次のようにすることもできます。
cmd1 && cmd2
(@shinがコメントでこれを指摘しているのを見ると、私は賛成票を投じました)。
また、以下を使用する「Bourne」シェルコードも多数見られます。
if ( ... )
then ...
fi
それが適切な場合もありますが、ほとんどの場合、Cシェルプログラマーは、この表記がBourneシェルおよび派生物(Kornシェル、POSIX準拠シェル、Bashなど)で「サブシェルを実行する」ことを意味することに気づかずに書いたものです。
コマンドからの出力をテストするのではなく、コマンドのステータスフラグをテストしているためです。
コマンドがstdoutに出力され、フラグが設定されている場合、指定した2つの例で異なる結果が得られます。
私はそれをテストした後、修正されたままです。何年も前にsolaris(kshの下?)で問題が発生したことを覚えていると思いましたが、テストを除いて、現在アクセスできるマシンでは再現できません:
[ $cmd
]の場合
はい、多くの人は後者のよりエレガントな形について知りません。私は以前にこれについて言及しました: http ://www.pixelbeat.org/programming/shell_script_mistakes.html