web-dev-qa-db-ja.com

「if」スイッチの場所はどこですか?

Bashスクリプトで使用するすべてのifスイッチのリストはありますか?誰かがそれを使用しているのを見ることがありますが、彼らが使用しているスイッチは実際に何をしているのでしょうか。

例は-zこれ。使用方法は知っていますが、どこから派生したのかわかりません。

if [ -z "$BASH_VERSION" ]; then
    echo -e "Error: this script requires the BASH Shell!"
    exit 1
fi

参照、ガイド、投稿、回答をいただければ幸いです。

30
Danijel-James W

Bashのマンページ(man bash)を見てください。オプションはCONDITIONAL EXPRESSIONSセクションで指定されます:

CONDITIONAL EXPRESSIONS
       Conditional expressions are used by the [[  compound  command  and  the
       test  and [ builtin commands to test file attributes and perform string
       and arithmetic comparisons.  Expressions are formed from the  following
       unary  or  binary  primaries.   If any file argument to one of the pri-
       maries is of the form /dev/fd/n, then file descriptor n is checked.  If
       the  file  argument  to  one  of  the  primaries  is one of /dev/stdin,
       /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2,  respectively,
       is checked.

       Unless otherwise specified, primaries that operate on files follow sym-
       bolic links and operate on the target of the link, rather than the link
       itself.

       -a file
              True if file exists.
       ... more options ...

ヘルプでも説明されています。

$ help [ [: [ arg... ]
    This is a synonym for the "test" builtin, but the last
    argument must be a literal `]', to match the opening `['.
33
SheetJS

はい。これらは 条件式 と呼ばれ、[[compound command およびtestおよび[組み込みコマンド[は、単にtestの同義語です。

Bash Reference Manual のセクション 6.4 Bash条件式 をお読みください。これには、これらすべてのスイッチとその使用法のリストが含まれています。

10
Johnsyweb

それらはifステートメントのスイッチではなく、testコマンド([test組み込みの同義語です)。見る help test完全なリストはbashで。

5
Dolda2000

単一の角括弧([ ... ])は、testコマンドの同義語です。 テストのマンページ を見ると、さまざまなifスイッチのほとんどすべてが表示されます(BASHには、ここで言及されていない余分なものがいくつかあります)。見つけやすい場所にすべて揃っています。

二重角括弧([[ ... ]])を使用する場合、テストの拡張BASHセットを使用しています。これらは主に、正規表現のマッチング、グロブマッチング(および、そのセットがあれば拡張グロブマッチング)に関係しています。そのためには、そのBASHマンページを読む必要があります。

それらをifスイッチと呼びましたが、それは実際には正しくありません。これらはtestsであり、ifコマンドとはまったく関係ありません。

ifコマンドは、指定されたコマンドを実行するだけで、そのコマンドが0の終了コードを返した場合、ifif部分を実行しますステートメント。それ以外の場合、else部分が実行されます(存在する場合)。

これを見てみましょう:

$ rm foo.test.txt   # Hope this wasn't an important file
$ if ls foo.test.txt
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
ls: foo.test.txt: No such file or directory
I can't find it anywhere..

ifステートメントはls foo.test.txtコマンドを実行し、lsコマンドはファイルが存在しないためゼロ以外を返します。これにより、ifステートメントがelse句を実行します。

もう一度試してみましょう...

$ touch foo.test.txt   # Now this file exists.
$ if ls foo.test.txt   # Same "if/else" statement as above
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
foo.test.txt
This file exists

ここで、lsコマンドは0終了ステータスを返しました(ファイルが存在し、ファイルが存在し、lsコマンドで統計できるため)。

通常、ファイルのテストにlsコマンドを使用しないでください。ここで使用したのは、ifステートメントがコマンドを実行し、そのコマンドの終了ステータスに応じてifまたはelse句を実行したことを示すためです。ファイルが存在するかどうかをテストする場合は、lsコマンドの代わりにtest -eコマンドを使用する必要があります。

if test -e foo.test.txt  # Same as above, but using "test" instead of "ls"
then
    echo "This file exists"
else
    echo "I can't find it anywhere.."
fi

ファイルが存在する場合、test -e0の終了ステータスを返します。それ以外の場合、ゼロ以外の終了ステータスを返します。

これを行う場合:

$ ls -i /bin/test /bin/[
10958 /bin/[    10958 /bin/test

10958inodeです。同じinodeを持つファイルは、同じファイルの2つの異なる名前です。したがって、[およびtestコマンドはソフトリンクされています1。これは、testの代わりに[を使用できることを意味します。

if [ -e foo.test.txt ]
then
    echo "This file exists"
else
    echo "I can't find it anywhere.."
fi

おなじみ?


1。 BASHでは、test[が組み込まれているため、BASHでこれらのコマンドを実行すると、/bin/testまたは/bin/[は実行されません。ただし、それらはまだlinked相互に関係しています。

3
David W.

実際にそれらを提供しているのはifではありません— [testという名前でよく知られています。 help testは、使用可能なすべてのオプションのリストを提供する必要があります。気にするなら 標準 も見ることができます。

3
icktoofay