Edited at

普段使いなbashのfor文

More than 5 years have passed since last update.

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