2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Makefileで数値の範囲でforループを回す(リストではなく)

Last updated at Posted at 2020-12-17

Makefileのfor文ループを回したかったのでヤホーでググった所大体の記事では

for_loop_with_list
$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みたいに大きな値の範囲をループを回す事。なのでその範囲の数字を全部書き出すとかとてもじゃないけどやってられない。何かいい方法がある筈だと思って探していたら見つけたのでメモ代わりに以下に紹介しておく。

for_loop_with_range_1
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を使う方法がある。

for_loop_with_range_2
loop :
    @for i in `seq 100`; do echo $$i; done
for_loop_with_range_3
loop :
    @for i in $(shell seq 100); do echo $$i; done

このseqを使った方法ではMake 3.81でも4.1でも4.2.1でも全てO.Kであった。
だけど個人的にはブレース展開の方が分かり易くて好きかな。

参考

2
0
0

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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?