Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

普段使いな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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away