数列 \( a_n = n + 2 \) の最初の4項を表示するスクリプト
01 #!/bin/bash 02 n=1 03 y=3 04 echo $y 05 while [ $n -lt 4 ]; do 06 n=$(( n + 1 )) 07 x=$y 08 y=$(( x + 1 )) 09 echo $y 10 done
実行するスクリプトには行番号など付いていないが,ここに示したものは先頭に行番号を書いた.
スクリプトの01行目はシェルスクリプトのおまじない. 本体は02行目以降である.
コードは前から順番に実行されるので,前から順番に見ていく.
処理01:02行目
変数 n という容れ物に,1 を入れる.
完了したら次の03行目に移動.
処理02:03行目
変数 y という容れ物に,3 を入れる.
このコードでは,変数 y に \( a_n \) の値を入れるようにしている.
この処理をおこなうとき,変数 n には 1 が入っている(処理01)ので,ここでは \( a_1 \) の値である 3 を変数 y に入れている.
処理03:04行目
変数 y の値を出力する.
変数 y には \( a_1 \) の値が入っている(処理02)ので,\( a_1 \) の値が出力される.
処理04:05行目
条件分岐.
変数 n の値が 4 よりも小さいなら,それに続く do と done の間を実行する.
変数 n の値が 4 以上なら,done の次の行に移動する.
ここでは,変数 n に 1 が入っている(処理01).
変数 n の値が 4 より小さいので,do と done の間を実行するべく,06行目に移動する.
処理05:06行目
変数 n に n + 1 を入れろ,という命令(シェルスクリプトにおいて,= は右辺の値を左辺に代入する,である).
この行に来たとき,変数 n には 1 が入っている(処理01で 1 を入れたあと変更がない)ので,変数 n に 1 + 1 の結果である 2 を入れる.
完了したら次の07行目に移動する.
以下,数列の第2項\( (n=2) \) を出力するための処理がおこなわれる.
処理06:07行目
変数 x に変数 y の値を入れろ,という命令.
処理06がおこなわれるとき,変数 y には \( a_1 \) の値が入れられている(処理03).
変数 n には 2 が入っている(処理05)ので,変数 y には \( a_{n-1} \) の値が入っていると,読み替えられる.
すなわち,変数 x に \( a_{n-1} \) の値 3 を入れる,という処理がおこなわれる.
処理07:08行目
変数 y に x + 1 の値を入れろ,という命令.
変数 x には \( a_{n-1} \) の値が入っている(処理06)ので,これは \( a_{n-1} + 1 \) の値を変数 y に入れる,ということである.
数列 \( a_n \) は漸化式 \( a_n = a_{n-1} + 1 \) で表されるので,これは変数 y に \( a_n \) の値を入れる,ということである.
この処理を始めるとき,変数 n には 2 が入っているので,この処理をおこなうと変数 y に \( a_2 \) の値が入る.
変数 x には 3 が入っている(処理06)ので,変数 y に 3 + 1 の結果である 4 が入る.
完了したら次の09行目に移動する.
処理08:09行目
変数 y の中身を表示しろ,という命令.
変数 y には \( a_2 \) の値が入っている(処理07)ので,\( a_2 \) の値が出力される.
完了したら次の10行目に移動.
処理09:10行目
done は条件が満足されたときに実行される一連の処理の終わりを表す.
一連の処理が終わったので,始まり(05行目)に戻る.
処理10:05行目
この行に戻ってきたとき,変数 n には 2 が入っている(処理05で 2 を入れたあと変更がない).
変数 n の値が 4 より小さいので,do と done の間を実行するべく,06行目に移動する.
処理11:06行目
変数 n には 2 が入っている(処理05で 2 を入れたあと変更がない)ので,変数 n に 2 + 1 の結果である 3 を入れる.
完了したら次の07行目に移動する.
以下,数列の第3項\( (n=3) \) を出力するための処理がおこなわれる.
処理12:07行目
変数 x に変数 y の値を入れる.
変数 y には \( a_{2} \) の値が入っている(処理07)ので,変数 x には \( a_{2} \) の値が入る.
完了したら次の08行目に移動する.
処理13:08行目
変数 y に x + 1 の値を入れる.
変数 x には \( a_{2} \) の値が入っている(処理12)ので,変数 x には \( a_{2} + 1 = a_{3} \) の値が入る.
完了したら次の09行目に移動する.
処理14:09行目
変数 y の中身を表示する.
変数 y には \( a_3 \) の値が入っている(処理13)ので,\( a_3 \) の値が出力される.
完了したら次の10行目に移動.
処理15:10行目
始まり(05行目)に戻る.
処理16:05行目
この行に戻ってきたとき,変数 n には 3 が入っている(処理11で 3 を入れたあと変更がない).
変数 n の値が 4 より小さいので,do と done の間を実行するべく,06行目に移動する.
処理17:06行目
変数 n には 3 が入っている(処理11で 3 を入れたあと変更がない)ので,変数 n に 3 + 1 の結果である 4 を入れる.
完了したら次の07行目に移動する.
以下,数列の第4項\( (n=4) \) を出力するための処理がおこなわれる.
処理18:07行目
変数 x に変数 y の値を入れる.
変数 y には \( a_{3} \) の値が入っている(処理13)ので,変数 x には \( a_{3} \) の値が入る.
完了したら次の08行目に移動する.
処理19:08行目
変数 y に x + 1 の値を入れる.
変数 x には \( a_{3} \) の値が入っている(処理18)ので,変数 x には \( a_{3} + 1 = a_{4} \) の値が入る.
完了したら次の09行目に移動する.
処理20:09行目
変数 y の中身を表示する.
変数 y には \( a_4 \) の値が入っている(処理19)ので,\( a_4 \) の値が出力される.
完了したら次の10行目に移動.
処理21:10行目
始まり(05行目)に戻る.
処理22:05行目
変数 n には 4 が入っている(処理17で 4 を入れたあと変更がない).
変数 n の値が 4 以上なので,done の次の行である11行目に移動する.
処理23:11行目 11行目は存在しないので,終了する.