ブレース展開は、中カッコ { } の中に書いたパターンから、複数の文字列を一度に作る bash の機能です。シェルスクリプトでよく使われ、たくさんのファイルを一度に作るときなど、作業を短く書けます。
この記事では、echo コマンドで展開の結果を見ながら、カンマ区切り、範囲指定、前後にテキストを付ける書き方、連結とネストの順に確認します。
- カンマ区切りと範囲(
..)で、ブレース展開のパターンを書く方法 - プリアンブル(前書き)とポストスクリプト(後書き)で、展開結果の前後にテキストを付ける方法
- ブレース展開の連結とネストで、組み合わせを一度に作る方法
- 年月入りのファイル名を一度に作る例と、展開されないときの注意点
ホスト名は linux-1、シェルは bash です。以降のコマンドと実行結果は、この環境のものです。
ブレース展開とは
ブレースは中カッコ { } のことです。この中にパターンを書くと、シェルがコマンドを実行する前に、パターンを複数の値に置き換えます。
{ } の中のパターンが、複数の値に展開される展開されるのはコマンドが実行される前なので、コマンドには展開後の値が引数として渡されます。以降の例では、引数をそのまま画面に表示する echo コマンドを使って、展開の結果を確認します。
パターンの表記
ブレース { } の中に、パターンを書きます。パターンの書き方は、カンマで区切る方法と、.. で範囲を指定する方法の2つです。
カンマ区切り
いちばん簡単な書き方は、{ } の中に値をカンマ区切りで並べる方法です。
hirotano@linux-1:~$ echo {1,2,3}
1 2 3
echo が実行される前に、{ } の中のカンマ区切りの数字は、次の図のように展開されます。
{1,2,3} の展開つまり、echo 1 2 3 が実行されるので、出力は 1 2 3 になります。数字だけでなく、文字列も並べられます。
hirotano@linux-1:~$ echo {Yamada,Suzuki,Tanaka}
Yamada Suzuki Tanaka
{Yamada,Suzuki,Tanaka} の展開範囲(数字)
連続する数字や英字は、範囲で指定できます。範囲は、始めの値と終わりの値を、ピリオド2つ(..)でつないで書きます。
1から5までの数字(1 2 3 4 5)を一度に出力するときは、次のように書きます。
hirotano@linux-1:~$ echo {1..5}
1 2 3 4 5
{1..5} の展開始めの値は、1以外の数字でもかまいません。始めの値を終わりの値より大きくすると、降順に展開されます。
hirotano@linux-1:~$ echo {5..1}
5 4 3 2 1
始めの値か終わりの値がゼロ(0)で始まっているときは、展開されるすべての値が同じ桁数になるように、ゼロで埋められます。たとえば {001..100} は、1から100までを3桁にそろえて展開します。10や99のような2桁の数字は 010 や 099 になります。
hirotano@linux-1:~$ echo {001..100}
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100
範囲の後ろに .. と整数を付けると、その整数が値の間隔になります。たとえば {1..10..3} は、1 4 7 10 に展開されます。何も付けないときの間隔は 1 です(降順のときは -1)。
範囲(文字)
英字(a から z、A から Z)も範囲で指定できます。a から e まで(a b c d e)を一度に出力するときは、次のように書きます。
hirotano@linux-1:~$ echo {a..e}
a b c d e
{a..e} の展開大文字も、逆順も展開できます。
hirotano@linux-1:~$ echo {A..E}
A B C D E
hirotano@linux-1:~$ echo {e..a}
e d c b a
範囲の両端は、数字どうし、または英字どうしにします。数字と英字を混ぜた範囲は展開されません。
プリアンブルとポストスクリプト
ブレース展開の前後にテキストを置くと、そのテキストが展開された値すべてに付きます。前に付けるテキストをプリアンブル(前書き:preamble)、後ろに付けるテキストをポストスクリプト(後書き:postscript)と呼びます。
プリアンブル(preamble)
前に付けたいテキストの後ろに、{ } のパターンを書きます。たとえば、file をプリアンブルにして、後ろに1から5を付けると、file1 file2 file3 file4 file5 を出力できます。
hirotano@linux-1:~$ echo file{1..5}
file1 file2 file3 file4 file5
プリアンブルの file が、展開されたすべての値の前に付いています。
ポストスクリプト(postscript)
後ろに付けたいテキストの前に、{ } のパターンを書きます。たとえば、.txt をポストスクリプトにして、1から5の後ろに付けると、1.txt 2.txt 3.txt 4.txt 5.txt を出力できます。
hirotano@linux-1:~$ echo {1..5}.txt
1.txt 2.txt 3.txt 4.txt 5.txt
ポストスクリプトの .txt が、展開されたすべての値の後ろに付いています。
両方を使うパターン
プリアンブルとポストスクリプトは、一緒に使えます。上の2つを組み合わせると、file1.txt file2.txt file3.txt file4.txt file5.txt を出力できます。
hirotano@linux-1:~$ echo file{1..5}.txt
file1.txt file2.txt file3.txt file4.txt file5.txt
連結とネスト
連結
ブレース展開を続けて書くと、それぞれの値が組み合わされます。{1,2}{3,4} は、左の {1,2} の値ごとに、右の {3,4} の値を付けた組み合わせになります。
hirotano@linux-1:~$ echo {1,2}{3,4}
13 14 23 24
{1,2}{3,4} の展開。左の値ごとに、右の値と組み合わされるプリアンブルとポストスクリプトも、組み合わされたすべての値に付きます。
hirotano@linux-1:~$ echo a{1,2}b{3,4}
a1b3 a1b4 a2b3 a2b4
a{1,2}b{3,4} の展開ネスト
{ } の中に { } を書く入れ子(ネスト)もできます。次の例を考えます。
hirotano@linux-1:~$ echo a{b{1,2},c{3,4}}d
ab1d ab2d ac3d ac4d
外側の { } の中は、カンマで b{1,2} と c{3,4} の2つに分かれます。それぞれの前後に a と d が付き、内側の { } がさらに展開されて、4つの値になります。展開された値は、左から順に並びます。
a{b{1,2},c{3,4}}d の展開ファイル作成への活用
ブレース展開を使うと、規則的な名前のファイルやディレクトリを一度に作れます。次の例は、ファイル名に年月を入れて、24個のファイルを新規作成したものです。{2021..2022} と {01..12} が連結されるので、年と月のすべての組み合わせになります。
hirotano@linux-1:~$ touch {2021..2022}-{01..12}-file.txt
hirotano@linux-1:~$ ls
2021-01-file.txt 2021-06-file.txt 2021-11-file.txt 2022-04-file.txt 2022-09-file.txt
2021-02-file.txt 2021-07-file.txt 2021-12-file.txt 2022-05-file.txt 2022-10-file.txt
2021-03-file.txt 2021-08-file.txt 2022-01-file.txt 2022-06-file.txt 2022-11-file.txt
2021-04-file.txt 2021-09-file.txt 2022-02-file.txt 2022-07-file.txt 2022-12-file.txt
2021-05-file.txt 2021-10-file.txt 2022-03-file.txt 2022-08-file.txt
ls の表示は、ターミナルの幅によって列の数が変わります。
展開されないとき
ブレース展開は、書き方によっては展開されず、文字がそのまま残ります。bash のマニュアルでは、ブレース展開は他のすべての展開よりも先に行われると説明されています。
| 書き方 | 結果 |
|---|---|
{1} | カンマも .. も含まないので展開されず、{1} のまま |
"{1,2}" | 引用符で囲むと展開されず、{1,2} のまま。バックスラッシュ(\)を前に付けた場合も展開されない |
{1..$n} | 変数は、ブレース展開の後に展開されるため、範囲の値には使えない。n=3 のとき、{1..3} のまま |
まとめ
ブレース展開は、{ } の中のパターンから、複数の文字列を一度に作る機能です。ここで紹介した書き方を、次の表にまとめます。
| 書き方 | 例 | 展開結果 |
|---|---|---|
| カンマ区切り | {1,2,3} | 1 2 3 |
| 範囲(数字) | {1..5} | 1 2 3 4 5 |
| 範囲(降順) | {5..1} | 5 4 3 2 1 |
| 範囲(文字) | {a..e} | a b c d e |
| プリアンブルとポストスクリプト | file{1..5}.txt | file1.txt file2.txt … file5.txt |
| 連結 | {1,2}{3,4} | 13 14 23 24 |
| ネスト | a{b{1,2},c{3,4}}d | ab1d ab2d ac3d ac4d |
コメント