89

通常、if ステートメントでは角括弧を使用します。

if [ "$name" = 'Bob' ]; then ...

ただし、grep成功したかどうかを確認するときは、角括弧を使用しません。

if grep -q "$text" $file ; then ...

ifステートメントで角括弧が必要なのはいつですか?

4

3 に答える 3

143

角括弧は、testコマンドの同義語です。ステートメントは、実行するif分岐を決定するために、コマンドの終了ステータスをチェックします。grep -q "$text"はコマンドですが、"$name" = 'Bob'そうではありません。単なる式です。test式を受け取って評価するコマンドです。

if test "$name" = 'Bob'; then ...

角括弧はtestコマンドの同義語であるため、元のステートメントとして書き直すことができます。

if [ "$name" = 'Bob' ]; then ...
于 2012-01-19T22:06:35.997 に答える
36

[は実際にはコマンドであり、コマンドと同等 (ほぼ、以下を参照)testです。これはシェル構文の一部ではありません。(シェルによっては、[との両方testが組み込みコマンドであることがよくありますが、おそらくパフォーマンス以外の動作には影響しません。)

ifステートメントはコマンドを実行しthen、コマンドが成功した場合はその部分を実行し、失敗した場合はそのelse部分 (存在する場合) を実行します。(コマンドは、0 のステータス ( $?) で終了する場合は成功し、0 以外のステータスで終了する場合は失敗します。)

if [ "$name" = 'Bob' ]; then ...

コマンドは

[ "$name" = 'Bob' ]

(同じコマンドを . なしで直接実行できますif。)

if grep -q "$text" $file ; then ...

コマンドは

grep -q "$text" $file

man [またはman test詳細については。

脚注: まあ、[コマンドはコマンドとほぼ同じtestです。違いは、が最後の引数として requireを[必要とし、実際にはそれを許可しないことです (より正確には、引数を特別に処理しません。たとえば、有効なファイル名である可能性があります)。(必ずしもそのように実装する必要はありませんでしが、マッチングのないは多くの人を非常に緊張させたでしょう。)]testtest][]

于 2012-01-19T22:05:53.007 に答える
10

[ ... ]構文を考える最良の方法は[、プログラムであると考えることです。

これをチェックしてください:

~ $ ls /usr/bin/\[ 
/usr/bin/[

一方、シェルの組み込みとしてbashも提供されているため、おそらくそのバージョンを使用していないでしょう。[

とにかく、あなたの質問に答えるには:あなたifが与えたコマンドを実行して、戻り値がそうである0かどうかを確認してください。[文字列比較など、他のより興味深い比較を行うために使用します。man [およびを参照してくださいman bash

于 2012-01-19T22:07:37.220 に答える