質問に対するchepnerの洞察に満ちたコメントに基づいて構築するには:
-
[ ! condition ]で 、!ただの引数です[に 組み込み (testの有効なエイリアス 組み込み);たまたま[/test引数!を解釈します 否定として。 -
! [ condition ]で 、!シェル キーワードです 後に続くコマンドを否定する (たまたま[この場合)
! [ condition ] の 1 つのこと 構文が暗黙的に与えるのは、否定が [ condition ] に適用されるということです 全体として評価される であるため、それが意図されている場合は、演算子の優先順位について心配する必要はありません。
パフォーマンス面 、どの構文を選択しても、おそらく大きな違いはありません。簡単なテストの提案:
-
conditionの場合!を渡すことで、どちらの場合も文字どおり同じです。[の引数として -
!の場合 キーワードとして使用されます 、したがって、優先順位を気にせずに条件を単純化できます。わずかに高速になる場合があります (例:! [ 0 -o 1 ]対[ ! \( 0 -o 1 \) ]; POSIX仕様に注意してください。-aの使用を思いとどまらせる と-oあいまいさのため)。
そうは言っても、Bash について話しているのであれば の場合、[[ の使用を検討する必要があります [ の代わりに 、なぜなら [[ シェル キーワードです 囲まれた式を特別なコンテキストで解析します:
- より多くの機能を提供
- 式を
&&と安全に組み合わせることができます と|| - サプライズが少ない
- また、わずかに高速です (実際には問題になることはめったにありません)
私のこの答えを見てください。
! 次のコマンドの終了コードを無効にします:
$ ! test 1 = 1 || echo $? # negate command with true expression
1
マニュアルページで述べたように、 test (および同様の [ 組み込み) 次の式で決定されるステータスで終了します:
$ test ! 1 = 1 || echo $? # return false expression
1
$ [ ! 1 = 1 ] || echo $?
1
特定の式の場合:
- 片側で
testを否定します true 式ステータスで終了するコマンド。 - 一方、式を否定し、
testコマンド (または[) false ステータスで終了
どちらも同じ効果があります。
したがって、これらの構文は同等であると言えます。外部 ! の利点 複合テストの否定を許可するには:
$ ! [ 1 = 1 -a 2 = 2 ] || echo $?
1