【図解:bash】ブレース展開の使用方法

ブレースとは、中カッコ { }のことで、この中にパターンを記述することにより、複数の文字列を一度に生成することができる機能です。
これらはシェルスクリプトでよく使われますし、一度に多数のファイル作成できるなど、処理の効率化も図れます。
スポンサーリンク

パターンの表記

ブレースである中カッコ { }の中に、パターンを記述します。

カンマ区切り

一番簡単なパターン記述は、{ }の中に、カンマ区切りで、値を列挙します。echo コマンドは、引数の文字を画面に表示するコマンドです。
hirotano@linux-1:~$  echo {1,2,3}
1 2 3
echoが実行される前に、{ }の中のカンマ区切りの数字は、下記のように展開されます。

すなわち、echo 1 2 3 が実行されていることになり、出力は、1 2 3 となります。
これは、数字だけでなく、文字列でも可能です。
hirotano@linux-1:~$ echo {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からでなく、どの数字から始まっても問題ありません

範囲は降順でも展開できます
hirotano@linux-1:~$ echo {5..1}   
5 4 3 2 1
ゼロ(0)でパディングされた数字も展開できます。例えば、001から100までの範囲をブレース展開すると、2桁の数字でも3桁目はゼロでパディングされます。
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

範囲(文字)

アルファベット文字aからz、もしくはAからZ)を範囲指定することができます。
例えば、a~eの文字(a b c d e )を一度に出力したい場合は、下記のように、パターンを記述します。
hirotano@linux-1:~$ echo {a..e}
a b c d 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 file 3 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}とすると、
hirotano@linux-1:~$ echo {1,2}{3,4}  
13 14 23 24

プリアンブルポストスクリプトも展開されたテキストすべての付きます。
hirotano@linux-1:~$ echo a{1,2}b{3,4}
a1b3 a1b4 a2b3 a2b4

ネスト

{ }の中に{ }があるネスト構造の場合、まず 一番中にある{ }から展開されます

下記の例を考えます。 
hirotano@linux-1:~$ echo a{b{1,2},c{3,4}}d
ab1d ab2d ac3d ac4d

このように、ブレース展開ができると、一度のパターン化されたファイルやディレクトなど作成することができます。例えば、下記はファイル名に年月を入れて、ファイルを新規作成した例です
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

コメント