シェルスクリプト

多数のコマンドを連続して繰り返し実行したいときには、 そのコマンドをファイルに書いておくことでまとめて実行する ことができます。このファイルに書かれたものをスクリプトと呼びます。
Cシェルのコマンドを使う時には、ファイルの最初に
#!/bin/csh
と書いておきます。またファイルは実行可能でなければいけません。
次の内容のファイルを tick という名前で作成しましょう。 なお、作業ディレクトリとして ~/script を作成して、そこへ移動します。
sw99% mkdir ~/script
sw99% cd ~/script
sw99% textedit tick &
#!/bin/csh
sleep 1
echo "Tick"
sleep 1
echo "Tack"
sleep 1
ファイルができたら、chmod コマンドで実行ビットを立てます。
sw99% ls -l
-rw-r--r--  1 99ss099 99ss 59 1月 10日 14:00 tick
sw99% chmod +x tick
sw99% ls -l
-rwxr-xr-x  1 99ss099 99ss 59 1月 10日 14:00 tick
ディレクトリリスト (ls) の長い形式で x が付いたことに 注目して下さい。x は実行可能なファイルであることを示します。
コマンドラインから tick を入力すると、1秒後に Tick が現れ、 その1秒後に Tack が表示され、さらにもう1秒たつとコマンドプロンプト に戻ることがわかります。
sw99% tick
Tick
Tack
ここで、もし tick なんてコマンドは無いよとエラーになったら、 ./tick とパスを明示してください。シェル変数の path に . が入っていない ためですが、実は「. が入っているとセキュリティ上ヤバイよね」という話もあります。 コマンドのタイプミスということもありえますが。。。

繰り返し

while (条件) ... end という書き方を使うと ...の部分を 繰り返し実行することができます。条件として 1 は真を表わしますので、 次のようなスクリプトは無限回繰り返されることになります。
#!/bin/csh
while (1)
 sleep 1
 echo "Tick"
 sleep 1
 echo "Tack"
end
このスクリプトを tk というファイルに作成し、実行してみましょう。 Contrl + C を押すと中断することができます。

また、foreach i (...) という書き方では ... のそれぞれに ついて i という変数に代入実行します。変数の参照には $i を使います。 また、変数名は i でなくても英文字であればOKです。

#!/bin/csh
foreach ff (*)
 echo -n "$ff "
 head -1 $ff
end
このスクリプトを atama という名前のファイルに作成して実行してみましょう。
sw99% atama
atama #!/bin/csh
tick #!/bin/csh
tk #!/bin/csh

コマンドの実行結果を変数に入れる

コマンドの実行結果を変数に入れて利用したいことがあります。 このためには ` (back quote) でコマンドを囲んでやります。 以下の例では date コマンドの結果を変数に入れています。
#!/bin/csh
# clk --- banner clock
while (1)
 clear
 set t = `date +%T`
 banner "$t"
 sleep 1
end
上のスクリプトを clk という名前で作成しましょう。 # で始まる行にはコメントを書くことができます。

いろいろなスクリプト

最初の #! だけは特殊なコメントで、その後に書かれた コマンド (/bin/csh) を起動することを意味します。 #! で指定するコマンドを /bin/awk -f に変え awk のコマンドを書くと、awk スクリプトができます。 同様にして sh スクリプト、sed スクリプト、perl スクリプト などを書くことができます。

練習問題

日本語の文字(漢字・全角かな・全角英数字など)は JIS (日本工業規格) で符号が定められていますが、(半角)英数字と同じ符号を使うため 区別ができるような工夫がされています。この符号化には3種類の 方法が使われており、それぞれ ISO-2022-JP(JIS7), Shift_JIS, EUC-JP などと呼ばれています。 というように使い分けられています。
そこで、皆さんがパソコンで作成した文書(レポートなど)をワークステーションに FTP で転送すると「文字化け」が起こることになります。文字コードの変換には フリーソフトの nkf がよく使われています。 情報科学科のシステムでは /pub/solaris/misc/bin/nkf にありますので、 もし path 変数に /pub/solaris/misc/bin が入っていなかったら ~/.cshrc を編集して追加しておきましょう。
nkf の使い方は、 です。オプションを指定しないと JIS に変換します。
練習問題の練習: 自分宛のメールは /var/mail/99ss999 (自分のID)に 入っています。more で表示して文字化けすることを確認しよう。 nkf -e /var/mail/99ss999 | more とすると読めるようになる。
練習問題の準備: 自分宛のメールの最後の20行を tail で取り出し、 lastmail という名前のファイルに保存しなさい。
練習問題の本番:ファイル lastmail に対し、2euc lastmail というコマンドを 実行すると EUC-JP に変換されたファイルが lastmail.euc という 名前で作成されるような cshスクリプト 2eucを作りなさい。
ヒント コマンドに付けられた最初の引数 (上の例では lastmail) は $1 で参照することができる。出力ファイルの作成には > (リダイレクト) を使うとよい。