bashの配列を連番で初期化するにはseqコマンドを使う

bash の配列の初期化などで、シーケンス(連続した値)を使用したい場合。
seq コマンドを使うか、または、シーケンス式を使う。

seq コマンドの場合

seq コマンドを使うと、引数に変数を使用できるので柔軟性がある。
例えば、var=5; arr=($(seq 1 $var)) とすれば、arr=(1 2 3 4 5) と同じ結果になる。

1$ var=5
2$ arr=($(seq 1 $var))
3$ echo ${arr[@]}
41 2 3 4 5

シーケンス式の場合

bashには、組み込みでシーケンス式(ブレース展開)が用意されており、これを使って配列に連番を設定できる。
シーケンス式は {x..y} の形式を取る。 ※x, y は同じ型でなければならない

1$ arr=({1..5})
2$ echo ${arr[@]}
31 2 3 4 5

しかし、連番の開始・終了の値に変数を使って柔軟に連番生成しようとすると、シーケンス式ではうまくいかない。
変数の展開(パラメータ展開)よりも先にブレース展開が行われるためだ。

例えば var=5; arr=({1..$var}) と書いたとき、次の1 〜 5 の流れで処理される。

  1. 最初にブレース展開しようとする
  2. $varはまだ展開されていないので、単に文字列とみなされる
  3. シーケンス式{1..$var}の内部の 1 と $var は型違いなのでブレース展開されない
  4. $var はパラメータ展開され、 5となる
  5. ({1..$var}) は ({1..5}) となり、これが arr に設定される
1$ var=5
2$ arr=({1..$var})
3$ echo ${arr[@]}
4{1..5}

関連ページ