それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashでC言語スタイルforループ

bash ではC言語スタイルのfor ループが使えます。

bash のループの例を調べると seq などが散見されるのですが、C言語スタイルのおなじみの for ループが使えます。

え?とおもった人はbash のヘルプをもう一度見てみてください

ヘルプの読み方
bash$ help 'for (('

C style for ループの例

これはもう、見たほうが早いですよね。

for (( idx=0 ; idx<10; idx++  )) ; do
  echo $idx;
done

ポイント

このポイントは、丸括弧を2つ書く、ダブルパーレンを利用する点にあります。

"(())" のdouble Parenthesis を使う。

また変数に$マークを付けないところも重要ポイントです。

bash のヘルプより

takuya@Desktop$ help 'for (('
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
    算術 for ループ

    以下と等価です。
        (( EXP1 ))
        while (( EXP2 )); do
            COMMANDS
            (( EXP3 ))
        done
    EXP1、EXP2、および EXP3 は数式です。いずれかの数式を省略した場合、
    値が 1 であるとして評価されます。

    終了ステータス:
    最後に実行したコマンドのステータスを返します。

seq 使うより楽

昔の記述を見ていると seq 使う例が多いようです。

これらはほとんど同じです。

 for i in `seq 1 10`  ;  do echo $i ; done;
 for i in $(seq 1 10)  ;  do  echo $i ; done;
 for i in   {1..10}  ;  do echo $i ; done;
 for (( i=1 ; i<=10 ; i++)); do echo $i ; done;

seq を使うとサブシェル(コマンド置換)を使うため極小で僅かだけパフォーマンス的に不利です。ほとんど気にならないけど。

読みやすさを考慮すれば、C言語スタイル for ループか、記号の少ない{1..10} のブレース展開が断然に有利だと思います。

bash 3.x から

この機能は、たしか bash 3.0 から追加されていたと思います。

参考資料

http://wiki.bash-hackers.org/syntax/ccmd/c_for