[ポスト] bashの、()、{}、(())、[]、[]判別bashの()で、{}、(())、[]、[]の差

区別のbashの()、{}、(())、[]、[]の中に

 
HTTPS:// www.cnblogs.com/marility/p/7259821.html 

差ハックの少なくともビットは離れて

慎重に必要

 

はじめに:判断の文字数値比較が行われた場合、常に問題は、その後、同時に「先進のbashスクリプティングガイド」を参照してCentOSのバージョン6.7でテストされている間、以下のように様々なカッコで遭遇bashは、現在の状況が要約されています。欠陥のある場合は、正しい見えます。

 

 

A.()

コマンドの組み合わせに対応するコマンド群

(I = XYZ;エコー$ I;);エコー$ I [ルート@ mghuee〜chunlanyy TESTDIR]#私は123 = 
XYZ 
123

 

 

 

II。{}

「{}」だけでなく、コマンドの組み合わせのために、「()」の違いは、後者は、シェルの内側にある前者は、シェルは、現在であることであると

コードをコピー
[ルート@ mghuee〜chunlanyy TESTDIR]#I = 123;(エコー$ I; I = XYZ;エコー$ I;);エコー$ I 
123 
XYZ 
123 
[ルート@ mghuee〜chunlanyy TESTDIR]#I = 123; {エコー$ I; I = XYZ;エコー$ I; };エコー$ I 
123 
XYZ 
XYZ
コードをコピー

 

例から、「()」が唯一独自のサブシェルに影響割り当てられ、シェルが親に割り当てられず、「{}」は、同じシェルで実行さ見ることができます

「;」コマンドの終了を示してもなお、「{}」ので、「{」の空間分離に必要であること、及び同時にコマンドを使用して、両側に、キーワードです。

[ルート@ mghuee〜chunlanyy TESTDIR]#タイプは{ 
{シェルキーワードです

 

 

 

 

III。[]

「[]」これは主に決意対象含むファイルタイプと割り当てとを比較する、決意条件として使用されています

[ルート@ mghuee〜chunlanyy TESTDIR]#型[ 
[シェル組み込みです

 

私たちは、基本的なテストコマンドに相当と考えることができ、「[」内部コマンドで見ることができます

[ルート@ mghuee〜chunlanyy TESTDIR]#[4 -lt 3] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#テスト4 -lt 3 &&エコーはい|| 無エコー
なし

 

 

一般的な比較テスト次のように:

デジタルテスト:-eq -ne -lt -le -gt -ge

ファイルテスト:-r、-l、-w、-x、-f、-d、-s、-nt、-ot

テスト文字列:=、=、 - nは、-z、\>、\ <!

ロジックテスト:-a、-o、!

数学:整数演算をサポートしますが、いれて「((...))」の代わりに、

 

ノートへのポイント:

1.唯一のデジタル比較-LT文字の比較では、しかし、あなたは「<\」でも追加エスケープ場合、「<」このようなAの比較演算子を使用することはできません

[ルート@ mghuee〜chunlanyy TESTDIR]#[1]> [2] &&エコーはい|| 無エコー
はい

 

明らかに、「1> 2」間違っている必要がありますが、「はい」と表示され、ここでは実際には「>」算術比較の数よりも大きくない、とlsコマンドによって、現在のディレクトリを表示するために出力をリダイレクトします複数のファイルという名前のファイル2

[ルート@ mghuee〜chunlanyy TESTDIR]#LL -l 
合計0 
-rw-rを- r--の。1ルートルート0 6月17日20時53 2

 

想像して誰かが数値比較をエスケープします

[ルート@ mghuee〜chunlanyy TESTDIR]#[1 \> 2] &&エコーはい|| 無エコー
なし

 

私たちの日常の中で理解されるべきではない、ここで「\>」我々の期待と、このラインを比較して数値比較のサイズが、

[ルート@ mghuee〜chunlanyy TESTDIR]#[\> 2] &&エコーはい|| 無エコー
はい

 

ここでは、同時にASCII値の比較サイズ比較では、唯一の単一文字のサイズ比較をサポートすることができ、ここで

[ルート@ mghuee〜chunlanyy TESTDIR]#[5 \> 20] &&エコーはい|| 無エコー
はい

 

 

2. "[]" は、-o、論理演算子のサポート-aです!-a、-oパラメータテストは、コマンドに相当するものであるときは、あなたは、&&使用することはできません||

[ルート@ mghuee〜chunlanyy TESTDIR]#[1 -lt 2 && 1 -lt 3] &&エコーはい|| エコーなし
-bash:[:行方不明`]」
なし

 

&&と||強い論理演算、コマンドを分割し、「[」「[1 -lt 2」&&「1 -lt 3]」、それはペアリングを示さないので、上記の例に分割されています

 

短絡動作がしますが、ではない&&論理演算において、[expre1 -a expre 2]及び[expre1 && expre2]完全に一致しないが、論理的-a

[ルート@ mghuee〜chunlanyy TESTDIR]#[1 -gt 3 -a 2> test1.txtという] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#lsの
test1.txtという

 

いいえ短絡、動作ロジックを実行全て決意した場合であっても「1 -gt 3」の結果がNOであるだけでなく、ファイルtest1.txtというを生成するが、エラー、次の動作がまだ実行されているがありません
[ルート@ mghuee〜chunlanyy TESTDIR]#[[1 -gt 3 && 2> test2.txtという名前]] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#lsの
test1.txtという

 

論理演算、およびコマンド、「1 -gt 3」以降の判断せずに、すなわち偽であるが、それはtest2.txtという名前が表示されません

 

3.「[]」はコマンドであるスプリットワード(単語分割)現象が存在することになるので、二重引用符または一重引用符を使用する必要参照変数または定数そこであります

コードをコピー
[ルート@ mghuee〜chunlanyy TESTDIR]#私は「29" =; [-f $ I] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#私は、「29" =; [-f "$ I"] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TESTDIR]#LL -a 
合計8 
drwxr-XR-X。2ルートルート4096 6月17日23時20。
drwxrwxrwt。6ルートルート4096 6月17日夜08時53 .. 
-rw-R - r--の。1ルートルート0 6月17日午後11時17分29
コードをコピー

 

変数二重引用符を参照するには、[] -f内部実行が決定されたときに[]が追加されていない中で名付けられ、現在のディレクトリ内のファイル(スペースの前にある29)「29」のファイルは、「29」があり、現在のディレクトリので、ファイルには、結果を示すことはありませんで、「29」のファイル名が存在しません。

 

IV。(())

これは、機能をできるように等価で、4つの操作をサポートしています

[ルート@ mghuee〜chunlanyy TESTDIR]#私は2 + 4 =ましょう;エコー$ I 
6 
、私は= [ルート@ mghuee〜chunlanyy TESTDIR]#$((2 + 4));エコー$ I 
6

 

V. [[]]

「[[」比較と決意のために、キーワードである、基本的なサポートは、「[]」の比較演算子の全てにおいて決定されます。

[ルート@ mghuee〜chunlanyy TESTDIR]#型[[ 
[[シェルキーワードがあります

 

 

"[[" と "[" の違い:

" - O" 1論理演算子矛盾、 "[]" は "-a" へ "&&"、 "||"、 "[]" です。「[]」短絡サポートロジック、および「[]」はサポートされていません

2. "[[]]" 正規表現のマッチングをサポートします。

3.「[]」をキーワードとして、中間空間と同じブラケットが単離されなければならない表現

4.「[[]]は、」比較演算子で使用する場合のWord-分割表示されていないが、逃げることができません

コードをコピー
[ルート@ mghuee〜chunlanyy TESTDIR]#私は「29" =; [[-f $ I]] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TESTDIR]#LL -a 
合計8 
drwxr-XR-X。2ルートルート4096 6月17日23時20。
drwxrwxrwt。6ルートのルート4096年06月17 20:53 .. 
-rw-R - r--の。1ルートルート0 06月17日23:17 29
コードをコピー

 

「[]」の結果と比較すると、それは「[[]]」には、明確であり、Wordの分割には表示されません。

[ルート@ mghuee〜chunlanyy TESTDIR]#[[> 1]] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TESTDIR]#[[\> 1]] &&エコーはい|| エコーなし
-bash:条件付きバイナリ演算子は期待
-bash: `\>」の近くに構文エラー

 

見ることができるように、エラーエスケープを使用した後

5. []に "==" を使用して "= - " で

両方のリファレンス「先進のbashスクリプティングガイド」の解釈

==文字列の比較演算子<==文字列比較

=〜正規表現マッチ演算子<==正規表現のマッチング

 

これは、「[]」マッチの一部を達成することができ、達成することができないで「==」正規表現パターンマッチングの代表ではありません

[ルート@ mghuee〜chunlanyy TMP]#[[ABC == * B *** C]] &&エコーはい|| 無エコー
はい

 

しかし、唯一の文字との間の一致を達成するために

[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ etc / passwd` == ^ルート]] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ etc / passwd` =〜^ルート]] &&エコーはい|| 無エコー
はい

 

「=〜」がマッチする正規表現で完了することがあります

 

注:正規表現パターンマッチングでは、二重引用符を使用しない権利をパターンマッチング、パターンにマッチする正規表現を使用しているときはbash 3.2のバージョンが明記された後にすることは、二重引用符と組み合わせることはできません

コードをコピー
[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ tmp / 123` =〜 "^ルート"]] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TMP]#猫123 
"^ルート" 
[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ tmp / 123` =〜^ルート]] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TMP]#猫123 
"^ルート"
コードをコピー

 

そのため、「[[]]は、」入社後、ワード分割に表示されますが、マッチパターンは「「」^ルート」となりできません

 

 

要約:

  1. "「$(())」とき演算「コマンドを聞かせて」、または使用します
  2. ファイルは、「] [」文字が空であるかどうかが存在しますか
  3. 論理演算子は "&&"、 "||" に "[]" で使用される " - "、 " - O" を "[]" 内に
  4. 二重引用符を使用するときに「[[]]」正規表現マッチングパターンに一致しません
  5. 「 - GT」「[]」「-lt」の使用と比較して比較し、数値のサイズ、使用することができ、このような比較演算子「<」、「>」
  6. 「[[]]」と「[]」両面で最高の保持空間は、「[[]]は」両側のスペースを分離しなければならないです
  7. 上記の通例使用されている、それは使用してはならない他のモードとの組み合わせで説明されていないが、いくつかの不可解なエラーを回避することができます

はじめに:判断の文字数値比較が行われた場合、常に問題は、その後、同時に「先進のbashスクリプティングガイド」を参照してCentOSのバージョン6.7でテストされている間、以下のように様々なカッコで遭遇bashは、現在の状況が要約されています。欠陥のある場合は、正しい見えます。

 

 

A.()

コマンドの組み合わせに対応するコマンド群

(I = XYZ;エコー$ I;);エコー$ I [ルート@ mghuee〜chunlanyy TESTDIR]#私は123 = 
XYZ 
123

 

 

 

II。{}

「{}」だけでなく、コマンドの組み合わせのために、「()」の違いは、後者は、シェルの内側にある前者は、シェルは、現在であることであると

コードをコピー
[ルート@ mghuee〜chunlanyy TESTDIR]#I = 123;(エコー$ I; I = XYZ;エコー$ I;);エコー$ I 
123 
XYZ 
123 
[ルート@ mghuee〜chunlanyy TESTDIR]#I = 123; {エコー$ I; I = XYZ;エコー$ I; };エコー$ I 
123 
XYZ 
XYZ
コードをコピー

 

例から、「()」が唯一独自のサブシェルに影響割り当てられ、シェルが親に割り当てられず、「{}」は、同じシェルで実行さ見ることができます

「;」コマンドの終了を示してもなお、「{}」ので、「{」の空間分離に必要であること、及び同時にコマンドを使用して、両側に、キーワードです。

[ルート@ mghuee〜chunlanyy TESTDIR]#タイプは{ 
{シェルキーワードです

 

 

 

 

III。[]

「[]」これは主に決意対象含むファイルタイプと割り当てとを比較する、決意条件として使用されています

[ルート@ mghuee〜chunlanyy TESTDIR]#型[ 
[シェル組み込みです

 

私たちは、基本的なテストコマンドに相当と考えることができ、「[」内部コマンドで見ることができます

[ルート@ mghuee〜chunlanyy TESTDIR]#[4 -lt 3] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#テスト4 -lt 3 &&エコーはい|| 無エコー
なし

 

 

一般的な比較テスト次のように:

デジタルテスト:-eq -ne -lt -le -gt -ge

ファイルテスト:-r、-l、-w、-x、-f、-d、-s、-nt、-ot

テスト文字列:=、=、 - nは、-z、\>、\ <!

ロジックテスト:-a、-o、!

数学:整数演算をサポートしますが、いれて「((...))」の代わりに、

 

ノートへのポイント:

1.唯一のデジタル比較-LT文字の比較では、しかし、あなたは「<\」でも追加エスケープ場合、「<」このようなAの比較演算子を使用することはできません

[ルート@ mghuee〜chunlanyy TESTDIR]#[1]> [2] &&エコーはい|| 無エコー
はい

 

明らかに、「1> 2」間違っている必要がありますが、「はい」と表示され、ここでは実際には「>」算術比較の数よりも大きくない、とlsコマンドによって、現在のディレクトリを表示するために出力をリダイレクトします複数のファイルという名前のファイル2

[ルート@ mghuee〜chunlanyy TESTDIR]#LL -l 
合計0 
-rw-rを- r--の。1ルートルート0 6月17日20時53 2

 

想像して誰かが数値比較をエスケープします

[ルート@ mghuee〜chunlanyy TESTDIR]#[1 \> 2] &&エコーはい|| 無エコー
なし

 

私たちの日常の中で理解されるべきではない、ここで「\>」我々の期待と、このラインを比較して数値比較のサイズが、

[ルート@ mghuee〜chunlanyy TESTDIR]#[\> 2] &&エコーはい|| 無エコー
はい

 

ここでは、同時にASCII値の比較サイズ比較では、唯一の単一文字のサイズ比較をサポートすることができ、ここで

[ルート@ mghuee〜chunlanyy TESTDIR]#[5 \> 20] &&エコーはい|| 無エコー
はい

 

 

2. "[]" は、-o、論理演算子のサポート-aです!-a、-oパラメータテストは、コマンドに相当するものであるときは、あなたは、&&使用することはできません||

[ルート@ mghuee〜chunlanyy TESTDIR]#[1 -lt 2 && 1 -lt 3] &&エコーはい|| エコーなし
-bash:[:行方不明`]」
なし

 

&&と||強い論理演算、コマンドを分割し、「[」「[1 -lt 2」&&「1 -lt 3]」、それはペアリングを示さないので、上記の例に分割されています

 

短絡動作がしますが、ではない&&論理演算において、[expre1 -a expre 2]及び[expre1 && expre2]完全に一致しないが、論理的-a

[ルート@ mghuee〜chunlanyy TESTDIR]#[1 -gt 3 -a 2> test1.txtという] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#lsの
test1.txtという

 

いいえ短絡、動作ロジックを実行全て決意した場合であっても「1 -gt 3」の結果がNOであるだけでなく、ファイルtest1.txtというを生成するが、エラー、次の動作がまだ実行されているがありません
[ルート@ mghuee〜chunlanyy TESTDIR]#[[1 -gt 3 && 2> test2.txtという名前]] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#lsの
test1.txtという

 

論理演算、およびコマンド、「1 -gt 3」以降の判断せずに、すなわち偽であるが、それはtest2.txtという名前が表示されません

 

3.「[]」はコマンドであるスプリットワード(単語分割)現象が存在することになるので、二重引用符または一重引用符を使用する必要参照変数または定数そこであります

コードをコピー
[ルート@ mghuee〜chunlanyy TESTDIR]#私は「29" =; [-f $ I] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TESTDIR]#私は、「29" =; [-f "$ I"] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TESTDIR]#LL -a 
合計8 
drwxr-XR-X。2ルートルート4096 6月17日23時20。
drwxrwxrwt。6ルートルート4096 6月17日夜08時53 .. 
-rw-R - r--の。1ルートルート0 6月17日午後11時17分29
コードをコピー

 

変数二重引用符を参照するには、[] -f内部実行が決定されたときに[]が追加されていない中で名付けられ、現在のディレクトリ内のファイル(スペースの前にある29)「29」のファイルは、「29」があり、現在のディレクトリので、ファイルには、結果を示すことはありませんで、「29」のファイル名が存在しません。

 

IV。(())

これは、機能をできるように等価で、4つの操作をサポートしています

[ルート@ mghuee〜chunlanyy TESTDIR]#私は2 + 4 =ましょう;エコー$ I 
6 
、私は= [ルート@ mghuee〜chunlanyy TESTDIR]#$((2 + 4));エコー$ I 
6

 

V. [[]]

「[[」比較と決意のために、キーワードである、基本的なサポートは、「[]」の比較演算子の全てにおいて決定されます。

[ルート@ mghuee〜chunlanyy TESTDIR]#型[[ 
[[シェルキーワードがあります

 

 

"[[" と "[" の違い:

" - O" 1論理演算子矛盾、 "[]" は "-a" へ "&&"、 "||"、 "[]" です。「[]」短絡サポートロジック、および「[]」はサポートされていません

2. "[[]]" 正規表現のマッチングをサポートします。

3.「[]」をキーワードとして、中間空間と同じブラケットが単離されなければならない表現

4.「[[]]は、」比較演算子で使用する場合のWord-分割表示されていないが、逃げることができません

コードをコピー
[ルート@ mghuee〜chunlanyy TESTDIR]#私は「29" =; [[-f $ I]] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TESTDIR]#LL -a 
合計8 
drwxr-XR-X。2ルートルート4096 6月17日23時20。
drwxrwxrwt。6ルートのルート4096年06月17 20:53 .. 
-rw-R - r--の。1ルートルート0 06月17日23:17 29
コードをコピー

 

「[]」の結果と比較すると、それは「[[]]」には、明確であり、Wordの分割には表示されません。

[ルート@ mghuee〜chunlanyy TESTDIR]#[[> 1]] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TESTDIR]#[[\> 1]] &&エコーはい|| エコーなし
-bash:条件付きバイナリ演算子は期待
-bash: `\>」の近くに構文エラー

 

見ることができるように、エラーエスケープを使用した後

5. []に "==" を使用して "= - " で

両方のリファレンス「先進のbashスクリプティングガイド」の解釈

==文字列の比較演算子<==文字列比較

=〜正規表現マッチ演算子<==正規表現のマッチング

 

これは、「[]」マッチの一部を達成することができ、達成することができないで「==」正規表現パターンマッチングの代表ではありません

[ルート@ mghuee〜chunlanyy TMP]#[[ABC == * B *** C]] &&エコーはい|| 無エコー
はい

 

しかし、唯一の文字との間の一致を達成するために

[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ etc / passwd` == ^ルート]] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ etc / passwd` =〜^ルート]] &&エコーはい|| 無エコー
はい

 

「=〜」がマッチする正規表現で完了することがあります

 

注:正規表現パターンマッチングでは、二重引用符を使用しない権利をパターンマッチング、パターンにマッチする正規表現を使用しているときはbash 3.2のバージョンが明記された後にすることは、二重引用符と組み合わせることはできません

コードをコピー
[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ tmp / 123` =〜 "^ルート"]] &&エコーはい|| エコーなし
はい
[ルート@ mghuee〜chunlanyy TMP]#猫123 
"^ルート" 
[ルート@ mghuee〜chunlanyy TMP]#[[ `猫の/ tmp / 123` =〜^ルート]] &&エコーはい|| エコーなし
なし
[ルート@ mghuee〜chunlanyy TMP]#猫123 
"^ルート"
コードをコピー

 

そのため、「[[]]は、」入社後、ワード分割に表示されますが、マッチパターンは「「」^ルート」となりできません

 

 

要約:

  1. "「$(())」とき演算「コマンドを聞かせて」、または使用します
  2. ファイルは、「] [」文字が空であるかどうかが存在しますか
  3. 論理演算子は "&&"、 "||" に "[]" で使用される " - "、 " - O" を "[]" 内に
  4. 二重引用符を使用するときに「[[]]」正規表現マッチングパターンに一致しません
  5. 「 - GT」「[]」「-lt」の使用と比較して比較し、数値のサイズ、使用することができ、このような比較演算子「<」、「>」
  6. 「[[]]」と「[]」両面で最高の保持空間は、「[[]]は」両側のスペースを分離しなければならないです
  7. 上記の通例使用されている、それは使用してはならない他のモードとの組み合わせで説明されていないが、いくつかの不可解なエラーを回避することができます

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/12166118.html