コマンドを使用して、ディレクトリに3つのファイルを作成しましたtouch inv{1..3}.txt
。今、私は2つのコマンドを使用しましたが、それらの出力はほとんど同じです。これらの2つのコマンドはあるls inv[13].txt
とls {1,3}.txt
。
では、これら2つはどのように違うのでしょうか。角括弧は中括弧とどのように異なりますか?また、「linux [..]」をグーグルで検索していましたが、何も見つかりませんでした。Linuxの用語でこれらが何と呼ばれているのかわかりますか?
ありがとう
{}
ブレース拡張と呼ばれます。これには2つの形式があります:{x..y}
と{x,y}
、を置換x
しy
、任意のアルファベットまたは数値に置き換えます。
最初の形式で{x..y}
は、からx
までのすべての値に展開されますy
。たとえば、{2..5}
に展開されます2
、3
、4
、5
。
2番目の明示的な形式で{x,y}
は、はx
、にのみ展開されy
ます。たとえば、{2,5}
に展開されます2
と5
。
拡張が不可能な場合、パターンは文字通りに扱われ{a..3}
ます。
注意すべき重要なことは、ファイルの作成/照合中に、ファイルの照合に関係なく、中括弧の展開が(可能であれば)行われることです。
[]
パス名拡張(またはグロブ)パターンとして知られています。ブレース展開とは異なり、ファイル名の照合中にのみ使用できますが、ファイルの作成時に使用すると文字通りに扱われます。
との2つの形式が[xyz...]
あり[x-y]
ます。
最初の形式では、角括弧内の任意の1文字に個別に一致します。つまり、各文字は個別に扱われます。だから、のために[25].txt
、それは名前のファイルに一致します2.txt
か5.txt
についてながら、現在のディレクトリにし[245].txt
、それが名前の任意のファイルと一致します2.txt
か4.txt
またはを5.txt
。
2番目の形式では、範囲の拡張は、可能であれば文字通りに扱われる場合は、個別に照合する前に最初に実行されます。したがって、の[2-5]. txt
場合、2.txt
or3.txt
または4.txt
orという名前のファイルと一致します5.txt
。範囲を拡張できない場合、たとえば[a-3].txt
。の場合など、文字通り処理されます。
これら2つの動作の重要な違いは、一致するパターンが多く、実際には一致しない場合です。中括弧の展開は何があっても実行されるため、特定のファイルが存在しないというエラーが表示されますが、パス名の展開は残りのエラーなしで可能な限り一致します。
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
移植性に関する注意:
[]
パス名展開オペレータは、Bourneシェルおよび誘導体のうち、従ってポータブルPOSIXによって定義されます。
ブレース拡張{}
はPOSIXで定義されていないため、すべてのシェル間で移植できるわけではありません。たとえば、dash
(sh
Ubuntuでは)これはありません。それはから借りたcsh
だけ例えば、特定のシェル上で動作しますbash
、zsh
、ksh93
、fish
。実装する前に、使用しているシェルがこれをサポートしていることを確認してください。
例:
$ touch {1..3}.txt
$ ls {1..3}.txt
1.txt 2.txt 3.txt
$ ls {1,2,3}.txt
1.txt 2.txt 3.txt
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory
$ ls [123].txt
1.txt 2.txt 3.txt
$ ls [1-3].txt
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加