それブレース展開でできるよ!

先日、IRCNet #ruby:*.jp で話題になったのでメモ。

シェルスクリプト中で連番や複数回の繰り返しが必要になった場合、BSD系 (4.2BSD以降・Mac含む) では jotGNU系では seq を使うことが多い。が、普通は片方しか入っていないし、互換性も全く無いというやっかいな代物。

http://d.hatena.ne.jp/hirata_yasuyuki/20110104/sequential_numbers

ということですが、bashzshなどのシェルで新しめのバージョンであれば、ブレース展開でできますね。

for i in {0..9}; do
    echo $i    #=> 0〜9を出力
done

増加分を考慮する場合は、あらかじめ計算しておく必要がありますが、以下のような感じですね。

 for i in {0..4}; do
    echo $((i*2+1))   #=>奇数のみ出力
done

で、ブレース展開はネストもできるので、こういうワンライナー的なことができるんですね。

# 「2010年01月」〜「2011年12月」を出力
for ym in 201{0,1}""{0{1..9},1{1,2}}"" ;do  echo $ym;   done

まぁ、これが読みやすいかは別ですが。

参考リンク
広い意味でコンピュータ関係のブログ
http://lhlhlh.blog71.fc2.com/blog-entry-3.html
Bashの変数パラメータ展開のまとめ
http://d.hatena.ne.jp/dharry/20090211/1234290856
ファイルネームに.bakを追加するときは mv filename{,.bak} とすれば良いことを知った
http://www.otsune.com/diary/2006/03/09/1.html#200603091
bash 4.0:数値列のブレース展開
http://emasaka.blog65.fc2.com/blog-entry-557.html