通常、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を[
必要とし、実際にはそれを許可しないことです (より正確には、引数を特別に処理しません。たとえば、有効なファイル名である可能性があります)。(必ずしもそのように実装する必要はありませんでしたが、マッチングのないは多くの人を非常に緊張させたでしょう。)]
test
test
]
[
]
[ ... ]
構文を考える最良の方法は[
、プログラムであると考えることです。
これをチェックしてください:
~ $ ls /usr/bin/\[
/usr/bin/[
一方、シェルの組み込みとしてbash
も提供されているため、おそらくそのバージョンを使用していないでしょう。[
とにかく、あなたの質問に答えるには:あなたif
が与えたコマンドを実行して、戻り値がそうである0
かどうかを確認してください。[
文字列比較など、他のより興味深い比較を行うために使用します。man [
およびを参照してくださいman bash
。