IT pass HikiWiki - [Exp2009pre]シェルスクリプト課題 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

((<"ITPASS 特別実習スケジュール表"|ITPASS 特別実習>))

{{toc}}


= 課題

== 問 1

=== 問題文

以下のファイルをダウンロードしてください.

((<URL:/~itpass/exp/fy2008/080509/report/dat/dat.tar.gz>))

具体的には, 以下のコマンドでダウンロードできます.

  $ wget http://epa.scitec.kobe-u.ac.jp/~itpass/exp/fy2008/080509/report/dat/dat.tar.gz

今いるディレクトリに dat.tar.gz というファイルが現れたはずです.
dat.tar.gz を tar コマンドなどで以下のように解凍します.

  $ tar zxf dat.tar.gz

dat というディレクトリが現れ,
中に 001.dat から 100.dat という名前のファイルが 100 個置いてあります.
この中に, 全く同じ内容のファイルのペアがあります.
何組あるかは分かりません. ペアをなさないファイルもあります.

quiz1.sh という名前のシェルスクリプトを作成し,
内容が同じであるペアのファイル名を
quiz1.txt という名前のファイルに書き出すようにしてください.

出力する際の書式は以下の通りです.
一行にペアとなるファイル名を並べて出力してください.
ファイルとファイルの間は半角空白を1文字入れてください.

  001.dat 003.dat
  005.dat 009.dat
  ...

レポート内には以下を記述してください.

* 実習者氏名
* 担当情報実験機名 (例: joho01)
* シェルスクリプトファイル quiz1.sh.txt へのリンク.
  (上記で作成した quiz1.sh を quiz1.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします
  * 実行する際のスクリプト, データの置き場を明示すること
* 実行結果 quiz1.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトルおよび,
    何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など

=== ヒント

* diff というコマンドで 2 つのファイルの違いを比較できます.
* wc というコマンドでファイルの大きさなどを調べることができます.
* 一般にシェルからコマンドを実行すると, コマンドは終了時にシェルに「終了ステータス(返り値)」を伝えます.
* 直前に終了したコマンドの終了ステータス(返り値)をシェル変数 $? で参照できます.
* スクリプトの内容によっては実行に時間がかかる (1 分くらい) ので,
  最初は自分で 3 つくらいファイルを作って確認してみると待ち時間を短くできます.

=== 解答例

やってみた後でご確認下さい.

* ((<スクリプト|URL:/~itpass/exp/fy2008/080509/report/answer_scripts/quiz1.sh.txt>))

== 問 2

=== 問題文

引数に任意の正の整数 m, n (ただし m <= n) を与えたとき,
以下の条件を満たすシェルスクリプトを作ってください.
スクリプト名は quiz2.sh とし,
m=1, n=99 としたときの結果を quiz2.txt に出力してください.

(1) 任意の整数 m から 1 ずつ増やした数字を n まで出力する.
(2) 3 の倍数のときと, 3 の数字がつくときに, 数字の後に fool と出力する.
(3) さらに, 8 の倍数のときに comfortable と出力する.

レポート内には以下を記述してください.

* 実習者氏名
* 担当情報実験機名 (例: joho01)
* シェルスクリプトファイル quiz2.sh.txt へのリンク.
  (上記で作成した quiz2.sh を quiz2.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします
  * 実行する際のスクリプト, データの置き場を明示すること
* 実行結果 quiz2.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトルおよび,
    何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など


=== 実行例

以下は引数に m=1, n=40 を与えた場合の実行例です.

$ ./quiz2.sh 1 40
$ cat quiz2.txt
1
2
3 fool
4
5
6 fool
7
8 comfortable
9 fool
10
11
12 fool
13 fool
14
15 fool
16 comfortable
17
18 fool
19
20
21 fool
22
23 fool
24 fool comfortable
25
26
27 fool
28
29
30 fool
31 fool
32 fool comfortable
33 fool
34 fool
35 fool
36 fool
37 fool
38 fool
39 fool
40 comfortable


=== ヒント

この問題はいろいろな解き方があります.
ヒントの内容を全部使おうとすると,
かえって解けなくなるかもしれません.

* 引数については ((<引数処理|[Exp2008]シェルスクリプト#引数処理>))
  を参照してください.
* いきなり作るのが難しい場合は,
  1 つめの条件のみを満たすスクリプトを作ってみて,
  少しずつ条件を足していくと作りやすくなります.
#* seq というコマンドで数字の列が出力できます.
* 実習資料に ((<数字の1から9を表示する|[Exp2008]シェルスクリプト#数字の1から9を表示する>)) という例があります.
* expr というコマンドで整数の計算ができます.
* 「FizzBuzz問題」で web 検索すると類似の問題の考え方や回答例を
  見ることができます.
  (ただし, ほとんどの回答は他のプログラミング言語で書かれていると思います).

=== 解答例

やってみた後でご確認下さい.

* ((<スクリプト|URL:/~itpass/exp/fy2008/080509/report/answer_scripts/quiz2.sh.txt>))


((<"ITPASS 特別実習スケジュール表"|ITPASS 特別実習>))