氏名:板倉 統 Itakura Matomu
担当情報実験機名:joho01
2010.5.18提出
2010.5.24修正
→今回の課題の出題ページ
このスクリプトは、あるディレクトリの中に入っている全てのファイルを、パーミッションを適切に設定して転送するスクリプトです。この作業を手作業で行うにはファイルを一つ一つ調べ、そのファイルタイプを確認してパーミッションを設定し、cpあるいはscpコマンドで転送するといった何段階ものコマンドの入力が必要です。しかしながら、毎回このような作業を行うことは大変に非効率です。そこで、これらの作業を自動的に行えるよう、シェルスクリプトとして纏めたものが、このスクリプトです。
”./quiz1.sh 転送元のディレクトリ名 転送先のディレクトリ名”を打って実行すると、転送元のディレクトリ内の全てのファイルのファイルタイプを調べ、ディレクトリとBashスクリプトなら775、それ以外は664に一旦変更して転送した後、転送元のファイルのパーミッションを復元します。
なお、スクリプトの3行目と4行目を書き換えることによってローカルからサーバーにアップロードすることも可能です。その際は途中でログイン用のパスフレーズを訊ねられますので入力してください。また、ディレクトリとBashスクリプト以外にも775に設定したいタイプがある場合には、スクリプトの47行目に書き加えることで可能になります。
ファイル名の取り出しとそのタイプを調べる部分は文字列の処理がなかなか上手くいかず苦労しましたが、一度出来上がってしまえばその後はコマンド一行で転送ができるようになり、ルーチンワークを自動化することのありがたみを感じることができました。
このスクリプトは、指定した年月のカレンダーを生成するスクリプトです。calコマンドとほぼ同様の動きをしますが、改暦前の1752年9月以前も現在のグレゴリオ暦で表示することができます。大まかには、ツェラー (Zeller) の公式を用いて求める年月の一日の曜日を求め、そこから一日の前に来る空白の数を求めて並べてから日付を1から並べて、7日ごとに改行することでカレンダーらしく表示しています。
”./quiz2.sh”と打って実行すると ” Enter year & month. ex) 2112 9 ” と訊ねられるので、年と月をスペースで区切って入力し、Enterキーを押してください。すぐにその年月のカレンダーが表示され、スクリプトと同じディレクトリ内のquiz2.txtに結果が書き込まれます。
なお、文字コードはEUC-JPを用いていますので、それ以外の環境の方は”./quiz2.sh e”と打って実行してください。文字が英語表記になります。また、島根県(出雲国)の方はお手数ですが”./quiz2.sh i”と打って実行してください。10月の旧暦月名が”神在月”と正しく表示されます。
チェックのためにcalコマンドと比較していましたところ、calコマンドは1752年9月が面白いことになっていることに気づきました。これはイギリス(とその植民地だったアメリカなども)が1752年9月14日よりユリウス暦からグレゴリオ暦に改めたことを反映しているそうですが、知らずにcalコマンドの表示を信じてしまうと稀に不都合が起こりそうなので、覚えておこうと思いました。
このスクリプトは、各桁が重複しない4桁の数字(ただし0は含まれない)を当てるゲームのスクリプトです。数字と桁の両方とも正解と一致する数字の数がHitに、数字は一致するが桁が違う数字の数がBlowに表示され、それをヒントに当てていきます。
”./quiz3.sh”と打って実行すると”Type your first answer!”と上機嫌に表示されますので、適当に4桁の数字を打ってEnterキーを押してください。すると”1 hit 2blow”などと表示されますので、それをヒントに次の4桁の数字を考えて入力してください。4桁全ての数字が当たりますと
”Your number matches the answer!!
You answered 7 times to get the answer.”
などと表示され終了します。途中、スクリプトと同じディレクトリ内のquiz3.txtに経過が書き込まれていきます。
スクリプトが正常に機能しているかチェックされる場合には、スクリプトの57行目の先頭の”#”を削除することで問題の数字を表示することができます。
なお、おかしな値を何度も入力すると、そのうち機嫌を悪くして強制終了します。こうなると、次回起動時に「sorry」と入力して謝らないとゲームが始まらなくなってしまいますので、くれぐれもご注意ください。
今回の三つの課題の中では一番素直に組み立てることができる問題だったと思います。その上、問1と問2の課題でBashにある程度は慣れることが出来たため、思ったよりもスムーズに組み立てることが出来ました。
ただ、今回作った三つのスクリプトを眺めていますと、条件分岐やループのカウンターなどを多用していて、不器用さが露呈していることは否めません。もっと美しいスクリプトが書けるよう精進したいと思います。