Bluepostech

まじめなことを書きます

【bash】forループで連番と飛び値を併用する方法

シェルスクリプトのfor文の基本的な文法は次のようなものになる。

for i in 1 2 3 5 7 11 13
{
command
}

書ききれるならこのようにすればいいし、この並びでは1,2,3が連番になっているので、次のように指定することもできる。

for i in {1..3} 5 7 11 13

範囲を変数で指定する、たとえば$listに範囲を格納してそこを参照するなら次のようにもできる。

list=1 2 3 5 7 11 13
for i in $list

ただし、この二つを組み合わせて次のようにするとどういうわけかエラーが出る。

list={1..3} 5 7 11 13
for i in $list

こういうときは、連番を生成するコマンド「seq」を バッククオートで囲む方法で代用する。

list=`seq 1 3`" 5 7 11 13"
for i in $list

バッククオートは「内部のコマンドを実行した結果を返す」という意味だ。つまり`seq 1 3`とは文字列「1 2 3」を意味する。つまり2重引用符の中身の頭に空白をつけなければ変数listの中身は「1 2 35 7 11 13」となりうまくまわらない。