Makefileのfor文ループを回したかったのでヤホーでググった所大体の記事では
$LIST := 1 2 3 4 5
loop :
@for i in $LIST; do echo $$i; done
みたいにリストの中のメンバーを一巡するような例ばかりで意外にもfor (i=0; i<100; i++)
みたいな変数の値の範囲を指定したループのやり方を紹介している記事が殆ど無かった。やりたいのは1~100とか1~1000みたいに大きな値の範囲をループを回す事。なのでその範囲の数字を全部書き出すとかとてもじゃないけどやってられない。何かいい方法がある筈だと思って探していたら見つけたのでメモ代わりに以下に紹介しておく。
loop :
@for i in {1..100}; do echo $$i; done
とシェルのブレース展開{<start>..<end>}
を使用して範囲を指定するだけ。これだけなのだが意外にもこの方法を書いている人が殆どいなかった。ループ変数iはシェルに$i
と言う文字列を渡したいのでエスケープ文字を追加して$$i
とするのを注意。
但し特定のバージョンのmakeではこの方法は使えないみたい。
確認したmakeのバージョン
GNU Make 3.81 -> OK
GNU Make 4.1 -> NG
GNU Make 4.2.1 -> OK
makeと言うよりシェルの種類やバージョンの問題かも。でも4.1の環境でシェルターミナルで直接for文を打って確認したらちゃんと動いたのでやはりmake側の問題なのだろう。
シェルのブレース展開{<start>..<end>}
を使用しない方法としてはシェルコマンドのseq
を使う方法がある。
loop :
@for i in `seq 100`; do echo $$i; done
loop :
@for i in $(shell seq 100); do echo $$i; done
このseqを使った方法ではMake 3.81でも4.1でも4.2.1でも全てO.Kであった。
だけど個人的にはブレース展開の方が分かり易くて好きかな。