質問に対する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