シェルスクリプト

多数のコマンドを連続して繰り返し実行したいときには、 そのコマンドをファイルに書いておくことでまとめて実行する ことができる。このファイルに書かれたものをスクリプトと呼ぶ。Cシェルのコマンドを使う時には、ファイルの最初に #!/bin/csh と書いておく。またファイルのパーミッションは実行可能でなければいけない。

シェルスクリプトの例

~/coreinfo/script ディレクトリを作成してそこに移動し、以下の内容を持つファイルを tick というファイル名で作成する。(作り方は第3回ファイルとディレクトリを参照)
#!/bin/csh
sleep 1
echo "TICK"
sleep 1
echo "TACK"
ファイルができたら、chmodコマンドで実行ビットを立てる。
chmodの詳細については教科書2.9 chmod コマンドによるアクセス権の変更も参考にせよ。
% ls -l tick
-rw-r--r--   1 tkikuchi isstaff       51 11月 29日  13:13 tick
% chmod +x tick
% ls -l tick
-rwxr-xr-x   1 tkikuchi isstaff       51 11月 29日  13:13 tick
ディレクトリリスト (ls) の長い形式で x が付いたことに 注目せよ。x は実行可能なファイルであることを示す。
コマンドラインから ./tick を入力すると、1秒後に TICK が現れ、 その1秒後に TACK が表示されコマンドプロンプトに戻る。
なお、UNIXの教科書によっては、.(カレントディレクトリ)を path 変数に付け加えることで 最初の ./ 無しでスクリプトを実行するように教えているものもあるが、セキュリティ上、システム管理者が管理しているコマンド以外は「明示的に」パスを指定したほうがよいので、path 変数には .を入れないほうがよい。
なお、dtpadで編集すると最後の改行が入らないことがあるので注意。

while による繰り返し

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

foreach による繰り返し

また、foreach i (...) という書き方では ... のそれぞれに ついて i という変数に代入実行する。変数の参照には $i を使う。(i はシェル変数である) また、変数名は i でなくても英文字列であればよい。
#!/bin/csh
foreach f (*)
    echo -n "$f "
    head -1 $f
end
このスクリプトを hd という名前のファイルに作成して実行してみよう。
% ./hd
hd #!/bin/csh
tick #!/bin/csh
tk #!/bin/csh
(hd スクリプトの3行目で $f と " の間の空白を Tab に変えると出力が少し見やすくなる)

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

コマンドの実行結果を変数に入れて利用したいことがある。 このためには ` (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 スクリプト、python スクリプト などを書くことができる。

練習問題

上の例に従って、
  1. tick
  2. tk
  3. hd
  4. clk
コマンドを作りなさい。

発展問題

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

補足

シェルスクリプトは、繰り返しの他に条件判定による分岐や、キーボード入力の読み取りもできるので、プログラミング言語と呼んでもよいくらいの機能を備えている。しかし、本格的なプログラミングを行うには、本当のプログラミング言語を使ったほうがよいことは言うまでもない。

<a href="http://www.is.kochi-u.ac.jp/~tkikuchi/>菊地のホームページ