Bashには、ブレース展開という機能があります。
この展開は自動的に行われますが、この展開の規則を覚えれば特定の作業が楽に行えることがあります。
ラズベリーパイでいろいろ試しながら特長を理解し、使いこなせるようにしましょう。
Bashのブレース展開とは
Bash(Bourne again shell)とは、UNIXのシェルの1つですが、このBashにはブレース展開という機能があります。
それは、ブレースと呼ばれる括弧”{}”で囲んだ文字列を、ある規則によって自動的に展開する機能です。
この記事では、Bashのブレース展開について書きます。Bashのバージョンによってはさらに拡張された機能もありますが、この記事ではもっとも基本的な機能について説明します。
ラズベリーパイでRaspbianをインストールすると、ログインシェルがBashで設定されますので、特に変更していなければ、コマンドラインでそのままブレース展開が実行されます。スクリプトで実行するならば、後述するようにシバンにbashを指定します。
展開の様子をechoで観察する
では、ブレース展開の挙動について調べてみましょう。
この挙動を調べるには、echoコマンドを使うのが簡単です。繰り返しになりますが、ログインシェルにbashを使用していることを前提とします。
スポンサーリンクLX terminalを開き、実際にコマンドを打ち込みながら確認していきましょう。
ブレース展開の基本
まず、{x,y} という記述を試してみます。
コマンドラインで、echo {x,y}と打ち込んでみてください。
1 2 | $ echo {x,y} x y |
“x y”という出力が得られました。このように、”x,y” という文字列をブレース”{}”で囲むと、x と y という2つの文字列に展開してくれるわけです。
次に、a{x,y} という記述を試してみます。
1 2 | $ echo a{x,y} ax ay |
{x,y}のブレース展開については先ほどの例と同じなのですが、さらにaという文字列をxとyのそれぞれに結合させて出力してくれます。
{x,y}a はどうでしょうか?
1 2 | $ echo {x,y}a xa ya |
予想通りですね。今度aという文字がxとyのそれぞれの後ろに結合されています。
次に、ブレース展開を複数つなげてみます。
1 2 | $ echo {a,b}{x,y} ax ay bx by |
今度はおもしろいことに、a{x,y}とb{x,y}とを連続して実行したときの結果が得られました。中学校の数学でやったカッコ付きの文字の式を展開するときのような挙動ですね。
ブレースの中の文字は3つあってもよいです。
1 2 | $ echo {a,b,c}{x,y} ax ay bx by cx cy |
これも予想通りですね。
ここまで、ブレースの中の文字は1文字づつでしたが、これは複数文字でも構いません。
1 2 3 4 5 6 | $ echo {.log,.txt} .log .txt $ echo aaa{.log,.txt} aaa.log aaa.txt $ echo {aaa,bbb}{.log,.txt} aaa.log aaa.txt bbb.log bbb.txt |
ブレース展開で使用できる連番生成の機能
もう1つ、連番を生成したいときにもブレース展開を活用できます。
1 2 | $ echo data_{1..10}.dat data_1.dat data_2.dat data_3.dat data_4.dat data_5.dat data_6.dat data_7.dat data_8.dat data_9.dat data_10.dat |
1..10 という部分をブレースの中に書くと、それを1, 2, …, 10と連続した数字に展開してくれます。
ブレース展開の活用例1:拡張子の変更
ブレース展開の簡単な例の1つが、拡張子を変更することです。
これは、以下の記事:
に書いた rename コマンドでもできますが、例えばカレントディレクトリにあるdata_1.datというファイルに対し、
1 | $ mv data_1{.dat,.log} |
を実行すると、data_1.datをdata_1.logにrenameできます。
これは、ブレース展開をechoコマンドで確認すると
1 2 | $ echo data_1{.dat,.log} data_1.dat data_1.log |
と展開してくれるわけですから、先頭にmvをつければ “mv data_1.dat data_1.log”と等価になることからも明らかですね。
ファイルを1つしか指定できませんが、記述がシンプルで使いやすい方法ではあります。
ブレース展開の活用例2:連番を含んだ名前のディレクトリを生成
何かの実験データを保管するために、あらかじめ決まった名前で、かつ連番を含んだ名前のディレクトリを生成したいとき、次のコマンドで実現できます。
1 | $ mkdir data_{1..100} |
これで、data_1, data_2, …, data100 という100個のディレクトリが生成されます。
1000個でも10000個でも簡単に生成できますね。
あるディレクトリ(例えば result というディレクトリ)の下に、上記と同じディレクトリ100個を作りたいときは、
1 | $ mkdir result/data_{1..100} |
とすればOKです。これは、活用できることがありそうですね。
もちろん、mkdir の代わりに touch コマンドを使うと、中身が空のファイルが data_1, data_2, …, data100 が生成されます。
ブレース展開の活用例3:シェルスクリプト内で連番を名前に含む変数の表示
シェルスクリプト内で、連番を名前に含む変数があり、その内容を表示するといった使い方も考えられます。
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash X1=300 X2=500 X3=700 X4=1000 X5=100 X_ALL=`echo $X{1..5}` echo $X_ALL |
シェルスクリプトのときは、シバンが #!/bin/sh でした。このスクリプトは、Bash のブレース展開の機能を使うために、 sh ではなく bash で実行しなければなりません。したがって、シバンを #!/bin/bash としています。
これを実行すると、
1 2 | $ sample1.sh 300 500 700 1000 100 |
となります。10行目がブレース展開されて、echo $X1 $X2 $X3 $X4 $X5 となったからです。