[ 岡山大学 | 理学部 | 地球科学科 | 地球および惑星大気科学研究室 ]

大気科学演習1

数列を表示するスクリプトの解説

数列 \( 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行目は存在しないので,終了する.




Last Updated: 2023/09/14, Since: 2023/09/14.
This page is generated by Makefile.rd2html.