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