forはifと並んでプログラミングでなくてはならない文法だ。
シェルスクリプトにも当然用意されていて、繰り返し何かを行うときに使われる。
目次
forとは
プログラミングを触ったことがある人はご存知の通り、「for」は「繰り返し」の制御文だ。
例えば、残金が100円未満になるまでおでんを買い続けるというプログラミングは下記のようになるが、これもforで作成することができる。
シェルスクリプトでのforは、C言語やJavaとくらべると少々勝手が違うように思える。Javaなどのfor文は「ループカウンタ」を用意しカウンタの数だけ繰り返しすることが殆どだろう。しかしbashの場合は「ワードリスト」を使って繰り返しをするという違いがある。
実際Javaなどのfor文のような記述も出来るようになっているが、ワードリストをつかうほうがbashでは一般的だ。
ワードリストの数だけ繰り返し処理がおこなわれることになるというのは、少々イメージしにくいかもしれない、そこは、後ほどサンプルコードをみれば、捕まえるはずだ。
シェルスクリプトでのforは、比較的繰り返し条件が単純な場合に利用される。複雑な条件式が必要な場合別途紹介する「while」を使用するのが一般的だろう。
スクリプトにおいて繰り返し処理は「単調な繰り返し作業を自動化」するのに重要な役割をはたすので積極的に活用しよう。
書式について
一般的な書式
for 変数 in リスト
do
処理...
done
リストの個数だけ処理が実行されるという書式になる。
もしくはC言語やJava風の記述が可能(bashの場合のみ)
C言語やJavaなど一般的なプログラミング言語のような記述も可能だ。
10回testを表示する場合の例
for ((i=0 ; i<10 ; i++))
do
echo "test"
done
「()」が二重になるところとセミコロンに気をつけてほしい
シェルスクリプトforのサンプルコード
それでは実際のコードを見ていこう。まずはシンプルな例を確認する。
vi for-ex1.sh
1 2 3 4 5 6 7 |
#!/usr/bin/bash #for文 iは任意の変数一般的に「i」「j」「k」「n」なとが使われることが多い #inより後ろを順に代入してゆくことになる。 for i in aa bb cc do echo $i done |
実行結果
1 2 3 4 5 |
$ ./for-ex1.sh aa bb cc $ |
このように$iに順番にリストが代入されて、表示されることになる。
もう少し実践的なfor文
seqを使う
seqは連続した数字を出力するコマンドだ。こうした一見不思議なコマンドは、スクリプト記述の時に役に立つように作られていることが多い。
例えば、
$ seq 10
とすると1から10までの数字が表示される。
これを利用すると以下のようにforを記述することが出来る
vi for-ex2.sh
1 2 3 4 5 6 |
#!/usr/bin/bash #echo "test"が10回実行される。 for i in `seq 10` do echo "test" done |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
$ ./for-ex2.sh test test test test test test test test test test $ |
必ずリストの中身を使わなければならないというわけではない
また実際にリストの数だけ繰り返しがおこなわれるが、かならずしもリストの内容を使用しなければならないというわけではない。
vi for-ex3.sh
1 2 3 4 5 6 |
#!/usr/bin/bash #echo "test"が3回実行される。 for i in aa bb cc do echo "test" done |
実行結果
1 2 3 4 5 |
$ ./for-ex3.sh test test test $ |
繰り返しを利用しバックアップをとる場合など
vi for-ex4.sh
1 2 3 4 5 6 7 |
#!/usr/bin/bash #lsで表示されたtxtをリストとして扱う。 for file_name in `ls *.txt` do #cpコマンドで名前に変数の値を参照、最後に.backの文字を追加してコピー cp "$file_name" "$file_name.back" done |
実行結果
1 2 3 4 5 6 |
$ ./for-ex4.sh $ ls for-ex4.sh* testfile10.txt testfile2.txt.back testfile4.txt testfile5.txt.back testfile7.txt testfile8.txt.back testfile1.txt testfile10.txt.back testfile3.txt testfile4.txt.back testfile6.txt testfile7.txt.back testfile9.txt testfile1.txt.back testfile2.txt testfile3.txt.back testfile5.txt testfile6.txt.back testfile8.txt testfile9.txt.back $ |
シェル上にて一行で繰り返しを行う。
$ for var in
seq 10
; do touch testfile"$var".txt; done
実行結果
1 2 3 4 5 |
$ for var in `seq 10`; do touch testfile"$var".txt; done $ ls testfile1.txt testfile2.txt testfile4.txt testfile6.txt testfile8.txt testfile10.txt testfile3.txt testfile5.txt testfile7.txt testfile9.txt $ |
連番のファイルなどをパッと作りたいしかし、スクリプトを書くほど大規模ではないなど、そういうときはコマンドプロンプトから直接for文を呼び出すこともできる。
上の例を参照してほしい。セミコロンの位置に注意しよう。forの条件のあとdoの条件のあとにセミコロンが挿入される。この例ではtestfile1.txtからtestfile10.txtが作成される。
セミコロンがない場合、以下のような対話的な処理となる。
実行結果
1 2 3 4 5 6 7 8 |
$ for var in `seq 10` > do > touch testfile"$var".txt > done $ ls for-ex4.sh* testfile10.txt testfile3.txt testfile5.txt testfile7.txt testfile9.txt testfile1.txt testfile2.txt testfile4.txt testfile6.txt testfile8.txt $ |
まとめ
このページではシェルスクリプトのforについて、色々なパターンをまとめて紹介した。
いずれもシェルスクリプトを使う上でなくてはならない文法だ。しっかり押さえておこう。
×いろいろなパターンを上記で初回したが
○いろいろなパターンを上記で紹介したが
おでん100円以上のNOは100円未満です。
ご指摘いただきありがとうございます。
100円以下→100円未満に訂正いたしました。
また、一部文章におかしな部分がありましたので訂正いたしました。
引き続き、ご愛読のほど、よろしくお願いいたします。