GNU/Linux >> Linux の 問題 >  >> Linux

テスト コマンドの前と後のネゲートに違いはありますか?

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

Linux
  1. ソーシング(「。」または「ソース」)とBashでのファイルの実行の違いは?

  2. バッシュ演算子の違い[[Vs[Vs(Vs((?

  3. 組み込みコマンドとそうでないコマンドの違いは?

  1. [[$ a ==Z*]]と[$a==Z *]の違いは?

  2. Linuxのlocateコマンドとfindコマンドの違いは何ですか

  3. ディストリビューション間で実行可能なバイナリ ファイルに違いはありますか?

  1. sudo crontab -e と crontab -e だけの Linux の違い

  2. 検索コマンドの '{}' と {} の違いは?

  3. 「man ls」と「ls --help」の違いは?