読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

bashなどで便利なブレース展開についてメモ

とりあえずこのエントリでは以下のような展開を指して「ブレース展開」と呼ぶことする(正式名称は知りません……).ブレース内で記述されたルールに基づいて文字列のリストが生成される.

$ echo {a,b,c}                       # アイテム 3 つのブラケット展開
a b c
$ echo どせい氏は{ばか,あほ}です.   # 隣接する文字列も一緒に展開される
どせい氏はばかです. どせい氏はあほです.

基本的はブレース内部にカンマ区切りでアイテムを 2 個以上並べることでリストを生成できる.またブラケットに付随する文字列も一緒に生成されるため,拡張子の異なるファイルリストを生成する場合などに便利.

こんてんつ
  1. ブレース展開を複数使用した場合
  2. ブレース展開内部に変数を使用した場合
  3. 連続したリストを生成するブレース展開

ブレース展開を複数使用した場合

使ってみれば分かりますが,複数使用しても特に問題なく使える.いくつまで使えるのか調べたことはないけど,一般的な範囲で制限に引っかかることはまずないと思う.ちなみに複数使用した場合は一番後ろのブレースから先に評価される.

$ echo {a,b}_{1,2,3}          # {1,2,3} が最初に評価される
a_1 a_2 a_3 b_1 b_2 b_3
$ echo {a,b,c}{1,2,3}{x,y,z}  # {x,y,z} が最初に評価される
a1x a1y a1z a2x a2y a2z a3x a3y a3z b1x b1y b1z b2x b2y b2z b3x b3y b3z c1x c1y c1z c2x c2y c2z c3x c3y c3z

ブレース展開内部に変数を使用した場合

以下に示すようにブレース展開と変数は同時に使用可能.

$ hoge="ばか"
$ fuga="あほ"
$ echo どせい氏は{${hoge},${fuga}}です.   # 変数を使用しても ok
どせい氏はばかです. どせい氏はあほです.

ただし,変数の内部をカンマ区切りのリストにしても展開はされない.

$ homu="a,b,c,d"
$ echo {${homu}}   # これは展開されない
{a,b,c,d}

また,このことから推測されるように展開の優先順位としては「ブレース展開>変数展開」なので,ブレース展開が行われた後にきちんと変数名が評価されないと誤った結果を引き起こすことになる.できる限り変数名はブレースで保護する習慣をつけたほうがよさそう.

$ hoge="homu"
$ fuga="homu"
$ hogehomu="false"
$ fugahomu="false"
$ echo {$hoge,$fuga}homu
false false
$ echo {${hoge},${fuga}}homu
homuhomu homuhomu

優先順位は「ブレース展開>コマンド呼び出し」なのでブレース展開の内部に `command`$(command)を埋め込むことができる.

$ echo {hoge,`echo fuga`}
hoge fuga
$ echo {hoge,$(echo {fuga,$(echo homu)})}
hoge fuga homu

連続したリストを生成するブレース展開

連続する整数やキャラクタを .. でつないだものをブレースの内部に入れることによってリストを生成することもできる.規則性のある文字列を展開したい場合に便利.

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {10..1}
10 9 8 7 6 5 4 3 2 1
$ echo {a..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 hoge{A..D}.tmp
hogeA.tmp hogeB.tmp hogeC.tmp hogeD.tmp

for ループの引数としても使うことができます.

$ for k in {1..10}; do printf "mkdir data_%02d\n" ${k}; done
mkdir data_01
mkdir data_02
mkdir data_03
mkdir data_04
mkdir data_05
mkdir data_06
mkdir data_07
mkdir data_08
mkdir data_09
mkdir data_10

おしまい.補足などある場合はコメントしていただけるとありがたいです.