【bash】ブレース展開についてまとめたメモ

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

コメント

タイトルとURLをコピーしました