ITPASS 実習レポート 1 (シェルスクリプト課題)
名前:斉田美香
担当情報実験機 : joho07
問 1
スクリプトのURL
http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/quiz1.sh.txt
(修正後)http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/quiz1_m.sh.txt
スクリプトの使い方の解説(修正後)
●準備として
- chmod 755 quiz1_m.sh を実行して実行可能にする。
●実行する
- ./quiz1_m.sh $1 を実行する。
* $1は作成したいhtmlファイルの名前 ex) test.html
- ページタイトル、著者、作成する項目数を尋ねられるので入力する。
*項目数は半角で入力
- 終了後、lsコマンドを使うとカレントディレクトリに
1.で指定したファイル名でhtmlファイルが作成されているのが確認できる。
実行例・実行結果へのリンク
実行例:http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/quiz1.txt
(ファイル名をquiz1.html、タイトルを神戸大学のみどころ、著者を神戸太郎、項目数を5とした場合)
実行結果:http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/results/quiz1.html
参考資料
UNIX & Linux コマンド・シェルスクリプト リファレンス
- forコマンドで、指定した回数繰り返し処理をする方法を参考にしました。
- ヒアドキュメントでコマンドに複数行にわたる文字列を与える方法を参考にしました。
2010 年のレポート課題
共同作業した人の名前
特になし
工夫したこと, 感想
- 項目数を任意の数だけつくるときに、forの使い方に苦戦しました。
- forから抜け出すときの条件文にtestコマンドが必要なこともすぐにはわかりませんでした。
- 複数行にわたる文字列(html)を書き出すときに、初めはechoをひたすら並べていましたが、
見栄えが悪く何か方法は無いかと調べていると、上記のサイトで紹介されていたので取り入れ、
当初よりは改善されたと思います。
- グルーピングという方法もあるようですが、次の機会に使ってみたいと思います。
問 2
スクリプトの URL
http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/quiz2.sh.txt
(修正後)http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/quiz2_m.sh.txt
スクリプトの使い方の解説(修正後)
●準備として
- chmod 755 quiz2_m.sh を実行してパーミッションを変更する。
●実行する
- ./quiz2_m.sh $1 を実行する
* $1は4桁の半角数字 ex)1234
- 計算結果が10になる式が表示される
* 誤って4桁の数字以外を入力すると
入力し直してくださいという旨のメッセージが表示されるので、やり直す。
* 計算結果が10になるような式が無い場合は、その旨が表示される。
実行結果へのリンク
http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/results/quiz2.txt
* 4桁の数字を8351とした場合
(修正後)http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/results/quiz2_m.txt
参考資料
HTMLタグ勉強中。
- viで括弧(と'*')の前には'\'をつける必要があったのを見落としていて、
ほとんど書き終わった後だったので置換の仕方を調べました。
M.Hiroi's Home Page
- このサイトのパズルの解法(Four Four's)で演算子も変数に入れて計算する方法を参考にしました。
UNIX & Linux コマンド・シェルスクリプト リファレンス
- cutの使い方と、ifでファイルサイズが0より大きいときなどの評価を調べました。
清水くんのレポート
- forの中に11種類の演算をまとめる方法を参考にしました。とても上手く、感心する内容でした。
共同作業した人の名前
特になし
工夫したこと, 感想
- 4桁の数字を4つに分解するところから躓きました。
- 括弧と3つの演算子の組み合わせがものすごい数になりましたが、
参考文献で演算子も変数に入れてしまえばいいとアイディアをいただけたので、なんとか行数を圧縮できました。
実は括弧の付け方も簡略化できるのかと思いましたが、思いつきませんでした。
- 引用符の使い方も注意しないと、特に*は\*としなければ変数展開されてしまうのでちょっと難しかったです。
(今回は繰り返し処理の演算子代入のときに'*'を代入して展開されないようにしました。)
- あと、直接課題には関係ないのですが、大量の括弧を書いた後に計算式には\をつけなければならないと知って
あわてて置換について調べました。多分、今後も役に立つと思います。
- 最後、ファイルサイズで計算式が存在するか判定しましたが、行数を数えているので
それが0かどうかでも判定できると気づきましたが、せっかくなのでそのままにしています。
- 工夫としては、計算式を出力するファイル(今の場合quiz2.txt)がすでに存在している場合は一旦内容をクリアするようにしました。
これでいちいちquiz2.txtを消去しなくても連続して使用できるようになりました。
修正後
- forを一つにまとめる方法が難しく、清水くんのレポートを参考にしました。
括弧を簡略化するというよりも、括弧を入れた式を先に作っておいてから、数字や演算子を代入する点が上 蠅い隼廚い泙靴拭
- 括弧をはずした式では最終結果しかわからないので、何種類式を作れるかということを分かりやすくするため、括弧を展開することはしませんでした。
1つめに比べてはるかに手強かったですが、いろいろ試行錯誤する過程は楽しかったです。
------------以下は5/27以降に追加した分です-------------
問 3
スクリプトの URL
http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/quiz3.sh.txt
(修正後)http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/quiz3_m.sh.txt
http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/score.dat
http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/scripts/score6.dat
スクリプトの使い方の解説(修正後)
●準備として
- まず初めに、使用する成績ファイルはquiz3_m.shと同じフォルダに置く。
- chmod 755 quiz3_m.sh を実行してパーミッションを変更する。
●実行する
- ./quiz3_m.sh $1 を実行する
* $1は上記のファイル(score.dat , score6.dat ,もしくはそれと書式の同じファイル)
- まず受験者数と教科数が表示される
- 成績を参照したい受験者名の入力を求められるので入力する
各教科の得点と全教科平均点が表示される
* もし存在しない受験者名を入力した場合は終了する
- その後どの教科の順位表の表示をするかどうかを尋ねられるので、表示されたうちから選んで入力する
実行結果へのリンク
http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/results/quiz3.txt
(修正後)http://itpass.scitec.kobe-u.ac.jp/~saichan/report01/results/quiz3_m.txt
参考資料
Mazn.net
UNIX & Linux コマンド・シェルスクリプト リファレンス
共同作業した人の名前
特になし
工夫したこと, 感想
- bashでは2次元配列が使えないので、成績ファイルのスコア部分を一旦仮の配列(info)に格納し、
infoの要素ごとに改めて受験者名の配列に成績を格納しなおせばよいと思いつくのは簡単でしたが、
実際にするとなるとかなり苦労しました。
whileやforが入れ子になってしまって、汚いプログラムだなあと自分でも思いますが…
- 特に苦労したのは、使用者の入力によって出力が変わるため、変数に変数の値を設定することが多くなり
evalで一旦変数を展開してからコマンドを実行することでした。
文字通り試行錯誤の繰り返しでした。なのでもっと簡略化して書けるような気もします。
- 今回は関数を使いませんでしたが、合計や平均を求めるところは関数ですっきり書けそうです。
このスクリプトでは合計や平均を元のデータファイルの配列に後付けする形にしました。
そのため、最後の順位表を作るときのデータの並び替えはスムーズに出来ました。
修正後
- 教科を選択して順位表を表示させるようにしました。
その際、Aと入力されたら1、Bなら2、,,,とするところが苦労しましたが、trコマンドを知って楽になりました。
- 並び替えの部分は教科によってどのフィードで並び替えるのかが変わるので、関数にしてみました。
全体を通してですが、本当に本当に失敗しては手直しして…の繰り返しでした。
なんでもそうですが、普段わたしたちが何気に利用しているものは全て
このような試行錯誤の賜物だなあと、改めてひしひしと感じられました。
他の人のスクリプトを見ても感心することが多く、とても勉強になりました。