bashのブレース展開についてまとめたメモです。
ブレース展開とは
ブレースとは{}のことで、{ルール}の中にあるルールを展開してくれる。
使い方を覚えておくと、繰り返し処理や一度に複数のファイル名を指定・作成する場合にとても役立ちます!
簡単なのでぜひ覚えましょう。
ルールについて
ブレース展開のルールは大きく分けて以下の2通りになります。
- カンマ区切り
- {文字1,文字2,文字3}
- {,文字1}(「,」のみを指定)
- 範囲指定
- {始め..最後}
- {始め..最後..(増・減)数}
カンマ区切り
「,」で区切って複数の文字や数字を指定すると、指定した順番で展開されます。
{文字1,文字2,文字3}
「,」で区切って指定した文字や数字を、指定した順番で展開します。
$ echo {a,b,c} a b c $ echo {5,3,1} 5 3 1
使用例
複数のファイルやディレクトリの作成・削除
こんな感じに、簡単に複数のファイルを作成することができます。
$ touch test_{1,2,3}.txt $ ls test_1.txt test_2.txt test_3.txt
削除も同様に行うことができます。
$ rm -v test_{1,2,3}.txt removed 'test_1.txt' removed 'test_2.txt' removed 'test_3.txt'
forの条件として使用
このようにforの条件として使用することもできます。
$ for i in {a,b,c}; do echo $i; done a b c
複数ファイルをgrep
catで表示するファイルをブレース展開で複数指定しgrepに渡すことで、一度に複数ファイルをgrepで検索することもできます。
$ sudo cat /var/log/{syslog,mail.log,auth.log} | grep error
{,文字1}(「,」のみを指定)
「,」だけを入力すると、何も文字や数字を指定しないことになります。
最初に「,」だけを指定すると、「a」(a+文字なし)「ab」「ac」といったように展開されます。
$ echo a{,b,c} a ab ac
真ん中にだけを指定すると、「ab」「a」(a+文字なし)「ac」といったように展開されます。
$ echo a{b,,c} ab a ac
使用例
「,」だけを指定する場合の使用例です。
例えば下記の指定例の場合、「/home/tamohiko/work/test.txt」「/home/tamohiko/work/test.txt_org」の2が表示されます。
$ echo /home/tamohiko/work/test.txt{,_org} /home/tamohiko/work/test.txt /home/tamohiko/work/test.txt_org
この指定方法を使うことで、長いディレクトリを2回指定せずに1行で同じディレクトリ内にファイルのコピーができてしまいます。
$ cp -p /home/tamohiko/work/test.txt{,_org} $ ls /home/tamohiko/work/test.txt* /home/tamohiko/work/test.txt /home/tamohiko/work/test.txt_org
ディレクトリの入力ミスとかが発生しないので便利ですね。
他にもmvコマンド等でも同様に使用すことができます。
範囲指定
連続する数字や文字の範囲を指定する場合{始め..最後}を使って範囲を指定します。
指定できる文字は「数字(整数)」「アルファベット大文字」「アルファベット小文字」となり、数字とアルファベットを同時に指定することはできません。
{始め..最後}
数字を範囲指定
1から5までの範囲をしてする場合は下記のようになります。
$ echo {1..5} 1 2 3 4 5
大きい数字から小さい数字への範囲指定
大きい数字から小さい数字へといったように、順番を逆に範囲指定することもできます。
$ echo {5..1} 5 4 3 2 1
0埋め
0をつけてあげると0埋めで数値を指定することができます。
$ echo {01..05} 01 02 03 04 05
0埋めする桁数も自由に指定できます。
$ echo {001..005} 001 002 003 004 005
文字を範囲指定
文字(アルファベット)を範囲指定することもできます。
$ echo {a..e} a b c d e
大文字も範囲指定できます。
$ echo {A..E} A B C D E
逆順で指定
文字の場合でも逆順で範囲指定もできます。
$ echo {e..a} e d c b a $ echo {E..A} E D C B A
大文字、小文字を連続で展開
大文字と小文字を連続でブレース展開させいた場合は、{{A..Z},{a..z}}といったように記述します。
「fold -w 52」部分は一行の表示数を設定しているだけなので、通常は必要ありません。
$ echo {{A..Z},{a..z}} | fold -w 52 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
文字と数字を範囲指定
数字と文字を一つの{}で範囲指定することはできませんが、下記のように「,」区切りと組み合わせることで、数字と文字で範囲指定することができます。
{{文字開始..文字最後},{数字最初..数字最後}}
実際の指定例です。
$ echo {{a..c},{1..3}} a b c 1 2 3
{始め..最後..(増・減)数}
範囲指定の後に「..」で増減数を指定すると、指定した数だけ増・減させて展開することができます。
{始め..最後..増減数}
1〜10までの数字を2ずつ増加させて表示。
$ echo {1..10..2} 1 3 5 7 9
10から1までの数字を2ずつ減らして表示。
$ echo {10..1..2} 10 8 6 4 2
応用編
ブレース展開を組み合わせることで、より複雑な展開を行うことができます。
ネスト(入れ子)
ネスト(入れ子)で指定した場合の例です。
$ echo a{b{1,2},c{3,4}}d ab1d ab2d ac3d ac4d
カンマ区切りと範囲指定の組み合わせ
カンマ区切りと範囲指定を組み合わせた例です。
$ echo a{b{1..3},c} ab1 ab2 ab3 ac
$の後にブレース展開させいたい場合
${ルール}の場合は変数として処理されるため、ブレース展開はされません。
$ echo ${1..3} bash: ${1..3}: bad substitution
$の後にブレース展開させいたい場合は\${}というようにエスケープさせる必要があります。
$ echo \${1..3} $1 $2 $3
コメント