if文でテスト式をいつ使用する必要がありますか?

if文でテスト式をいつ使用する必要がありますか?

Bashスクリプトの場合は、ifステートメントでテスト式をいつ使用するかを混乱させます。

たとえば、次のように動作します。

if finger | grep -q alex

しかし、以下の場合はそうではありません。

if [ finger | grep -q alex ]

ただし、次のことができます。

if [ 3 -gt 5 ]

それでは、いつテスト式を使用し、いつ使用しないでください。また、上記のコマンドでテスト式を使用する方法はありますか?

ベストアンサー1

test混乱の原因は、(AKA [)が成功(0)または失敗(ゼロ以外)の結果を返す別のコマンドであることを知らないか、それが何であるかを完全に理解していないためです。スーダン。

if常に次のように実行します。

if command; then
  do something
fi

elifオプションまたは句を含むelse

コマンドは、testまたは、[または他のもの(長くて複雑なコマンドパイプラインでも)にすることができ、すべてのプログラムは終了時に終了コードを返します。 @Kamil Maciorowskiがコメントで述べたように、重要なのは終了コードであり、終了コードのソースは重要ではありません。fingergrepif

test/は[多くの最新のシェル(bashを含む)に組み込まれているコマンドですが、これは実際には変更されません。組み込みコマンドになる前に、/usr/bin/test実際には/usr/bin/[外部バージョンが今日testでもまだ[存在しています(GNU bashの組み込みコマンドとしても提供されていますが、GNU coreutilsに含まれています)。

$ ls -l /usr/bin/test /usr/bin/[
-rwxr-xr-x 1 root root 68496 Sep 21 01:27 /usr/bin/[
-rwxr-xr-x 1 root root 60304 Sep 21 01:27 /usr/bin/test

$ dlocate /usr/bin/test '/usr/bin/\['
coreutils: /usr/bin/[
coreutils: /usr/bin/test

ところで、help [bashから:

[: [ arg... ]
    Evaluate conditional expression.
    
    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

おすすめ記事