【課 題】
引数として与えた複数のファイルに対し,所有者の書き込み権限があるものからは書き込み権限を取り除き,逆に書き込み権限がないものには書き込み権限を付加するスクリプトを作成せよ。

【解 説】
 シェル・スクリプトの引数に複数のファイルを指定し,各ファイルを順番に処理していく場合を考えよう。こうしたケースでは,繰り返し処理を利用して,一つひとつのファイルを順番に処理するスクリプトを作成すればよい。今回の例では,「引数として指定された各ファイルの書き込み権限を調べ,その結果に応じて権限を変更する」処理となる。

 ファイルのパーミッションの変更には,chmodコマンドを利用する。所有者に書き込み権限を付加する場合は,

chmod u+w file

を実行する。逆に書き込み権限を取り除くには,「u+w」を「u-w」に変更する。

 次にプログラムの流れを考えよう。今回は与えられた引数(つまり,ファイル)を1つずつ処理する。1個のファイルに対する処理は,「書き込み可能か否かを調べ,それに応じて条件分岐をして権限を変更する」となる。よって,図1のようなフローチャートになる。

図1●フローチャート
図1●フローチャート
与えられた引数の分,繰り返す。繰り返し処理内では条件分岐により処理を分ける。

 繰り返し処理には,for文を利用する。for文はin以下に与えられた文字列を順々にforの後に与えた変数(ここではfn)に代入していく。その後,doからdoneの処理行う。すべての文字列が変数に代入されたら,forの処理を終了する。

 inの後の$@は与えられた引数すべてを表す。また,スペースなどを含むファイル名を1つの引数として扱うために,「」でくくっている。

 繰り返し処理中ではifを使って条件分岐をする。条件の判別には,testまたは[...]コマンドを用いる。今回の判別式はファイルが書き込み可能か否かを確認するものなので,「-w」を使えばよい。よって判別式は,[ -w $fn ]となる。

 また,条件が満たされなかった場合にメッセージを表示するよう,else文を利用して分岐を行うようにしておく。

【解答例と練習問題は次ページ】