LoginSignup
57

More than 5 years have passed since last update.

普段使いなbashのfor文

Last updated at Posted at 2014-08-31

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57