`a[bc]d`(括弧)と `a{b,c}d`(中括弧)の違いは何ですか?

`a[bc]d`(括弧)と `a{b,c}d`(中括弧)の違いは何ですか?

a[bc]dこれらとそしての違いは何ですかa{b,c}da{b,c}dすでに存在しているのに、なぜ人々はまだそれを使用するのですかa[bc]d

答え1

二人は全く違います。

a[bc]dファイル名パターン(を除くシェルからfish)。 2つに拡張されますファイル名 abdacdこれが現在のディレクトリにある既存のファイルの名前の場合。

  • この[...]部分は、リストされている文字のうちの1文字と一致する(または範囲が含まれているときに要素を照合する)角括弧式です。パターンを一致させるには、a[bc]d文字列の間aとファイル名の間の文字が必要dです。bc

  • abd存在するが存在しない場合acdにのみ拡張され、abdその逆も同様です。

  • abd、も存在しない場合、acdシェルとオプションによってエラー(元のUnix 、、、、、sh)が発生し、シェルを終了できます。モードを拡張せずに(Bourneや同様のシェルに似ている)、何も拡張しないことがあります。 (、いくつかの以前のバージョン、元のUnix 、および同じコマンドに異なる一致するglobがある場合)。(t)cshzshfishbash -O failglobrcbash/zsh/yash -o nullglobfishsh(t)csh

a{b,c}d支柱の拡張(これをサポートするシェルから)。 2つに拡張されますひも abdそしてacd

  • 部分{...}はカンマで区切られた文字列のセットです(この場合、一部のシェルでは、またはなどの範囲、またはなどのa..k20..25レベルの範囲である可能性があります)。そしてEachはサイドキャラクタと組み合わせて、次のことを行います。拡張文字列 sum を計算します。これらの文字列は単一文字より長いか、中括弧で拡張できます。00..20..20..20..2%02dad

  • これらの文字列が既存のファイル名と一致するかどうかに関係なく、拡張が発生します。

文字列を生成するには、中かっこ拡張を使用します。ファイル名を一致させるには、ファイル名パターンを使用します。


この特別なケースでは、1はa[bc]d既存のファイルの名前である可能性があるため、rm -f ./*.[ch]これらのシェルでこのような名前を使用することは潜在的に危険でrm -f ./*.{c,h}問題が少なくなります。

答え2

a[bc]dはいパターンマッチングであり、POSIX規格の一部です。 POSIXではこれを「パターン角括弧式」と呼びます。に記録されています。マニュアルセクション2.13

引用符がなく、角括弧式の外側にある場合、次の3文字はパターン仕様で特別な意味を持ちます。

      疑問符は、どの文字にも一致するパターンです。
    *
      アスタリスクは、複数の文字に一致するパターンで説明されているように、複数の文字に一致するパターンです。
    [
      開く括弧はパターン括弧式を導入する必要があります。

セクション2.13.3では、ファイル名の拡張に使用される場合、通常の正規表現で予想されるものとは異なる動作をする(強調表示)。

単一文字に一致するパターンおよび複数の文字に一致するパターンでこれまでに説明されている規則は、ファイル名拡張にパターン一致表記が使用される場合に適用される次の規則によって制限されます。

パス名のスラッシュ文字は、パターンに1つ以上のスラッシュを使用して明示的に一致する必要があり、アスタリスクまたは疑問符の特殊文字または角かっこ式と一致することはできません。パターンのスラッシュは、角かっこ式の前に認識する必要があります。したがって、ファイル名を拡張するためのパターン角括弧式にスラッシュを含めることはできません。対応する右角かっこが見つかる前にエスケープされていない左角かっこ文字の後にスラッシュ文字が見つかった場合、左角括弧は通常の文字として扱われます。たとえば、パターンは"a[b/c]d"、または同じパス名と一致しません。リテラルパス名にのみ一致します。abda/da[b/c]d

a{b,c}dはい支柱の拡張、これはPOSIX仕様ではありません。 bashの対応する部分は次のとおりです。手動(私のハイライト):

中括弧拡張は任意のメカニズムです。ひも発生する可能性があります。このメカニズムは次のようになります。ファイル名拡張子(ファイル名拡張子を参照)、しかし生成されたファイル名が存在する必要はありません。。中かっこを拡張するパターンはオプションの形式を取ります。見出し、 その後、一連のカンマ区切り文字列または中括弧ペアの間のシーケンス式が続き、その後にオプションの文字列が続きます。 PS。プリアンブルは中括弧内に含まれる各文字列の接頭辞として機能し、PostScriptは各結果文字列に追加され、左から右に展開されます。

@mosvyのコメントによると、これは最初に登場しましたが、他のシェルとは異なるcsh動作をします。このタイプの支柱の拡張も存在します。bashcshglob(3)

{a..z}3.0以降にのみ登場した一種の支柱拡張もありますが、bash4.0ではより多くの機能が追加されました。bash

globbing を開くシェルの空のフォルダで実行し、次の結果を返します。

$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd

@Jesse_bのコメントによると、インタラクティブシェルにあり、両方が機能している場合、入力はa[bc]dあまり面倒ではありません。たとえばgrep pattern [ab][12].txt

関連情報