bashプログラミングじゃなくて、普段のターミナル作業での便利なfor文の使い方について。
C言語っぽい形式
まずいちおう紹介で、数字をインクリメントするだけならC言語っぽい形式でも書けます。
$ for((i=0;i<5;i++));do echo $i;done
0
1
2
3
4
ただ個人的にはあんまり使いません。後述する『for in形式 + ブレース展開』のほうが好みなので。
for in形式
続いてfor in形式のfor文。
基本はこんな感じです。
$ for i in aaa bbb ccc;do echo $i;done
aaa
bbb
ccc
グロブと合わせたファイル処理はよく使います。
$ for i in *.log;do cp $i $i.back;done
コマンド実行結果と組み合わせることもできますが、
$ for i in `find . -name "*.log"`;do cp $i $i.back;done
こういう場合はwhile文のほうが見やすい気がしますし、
$ find . -name "*.log" | while read l;do cp $l $l.back;done
xargsで簡単にすむ場合はそうします。
$ find . -name "*.log" | xargs grep -i error
ブレース展開との組み合わせ
ブレース展開というのは{}でくくったテキストをbashがいい感じに展開してくれる機能です。
$ echo {0..4}
0 1 2 3 4
$ echo app0{1..2}
app01 app02
$ echo {app,db}0{1..2}
app01 app02 db01 db02
for文を組み合わせるといろいろ便利に使えます。
単純な数値のインクリメントはこう書けますし、
$ for i in {0..4};do echo $i;done
0
1
2
3
4
ホスト名、IPアドレスを指定して複数サーバにsshでの連続ログイン、連続コマンド実行なんかに使っても便利です。
$ for i in 192.168.1.10{1..2};do ssh $i;done
[mikeda@test01 ~]$ exit
logout
[mikeda@test02 ~]$ exit
logout
$ for i in 192.168.1.10{1..2};do ssh $i hostname;done
test01
test02