通常、if ステートメントでは角括弧を使用します。
if [ "$name" = 'Bob' ]; then ...
ただし、grep成功したかどうかを確認するときは、角括弧を使用しません。
if grep -q "$text" $file ; then ...
ifステートメントで角括弧が必要なのはいつですか?
通常、if ステートメントでは角括弧を使用します。
if [ "$name" = 'Bob' ]; then ...
ただし、grep成功したかどうかを確認するときは、角括弧を使用しません。
if grep -q "$text" $file ; then ...
ifステートメントで角括弧が必要なのはいつですか?
角括弧は、testコマンドの同義語です。ステートメントは、実行するif分岐を決定するために、コマンドの終了ステータスをチェックします。grep -q "$text"はコマンドですが、"$name" = 'Bob'そうではありません。単なる式です。test式を受け取って評価するコマンドです。
if test "$name" = 'Bob'; then ...
角括弧はtestコマンドの同義語であるため、元のステートメントとして書き直すことができます。
if [ "$name" = 'Bob' ]; then ...
[は実際にはコマンドであり、コマンドと同等 (ほぼ、以下を参照)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][]
[ ... ]構文を考える最良の方法は[、プログラムであると考えることです。
これをチェックしてください:
~ $ ls /usr/bin/\[
/usr/bin/[
一方、シェルの組み込みとしてbashも提供されているため、おそらくそのバージョンを使用していないでしょう。[
とにかく、あなたの質問に答えるには:あなたifが与えたコマンドを実行して、戻り値がそうである0かどうかを確認してください。[文字列比較など、他のより興味深い比較を行うために使用します。man [およびを参照してくださいman bash。