シェルスクリプト

〜 バッチ処理をするには? 〜

DOS を知っている人ならバッチファイル(*.bat) を作ったことがあるでしょう。 あるいは、UNIX 上で自動的にいくつかの プロセスを実行したいと思うことがあると思います。 これを実現するのがシェルスクリプトです。

ここではシェルスクリプトの簡単な書き方を紹介しておきましょう。


シェルスクリプトは基本的に次のような形をしています。
#!/bin/sh
list 1
list 2
......
list n
ここで、先頭行はこのファイルを /bin/sh という UNIX の基本的なシェルに渡して実行させることを 意味します。この部分を省略すると ユーザのデフォルトのシェル(これは finger コマンドを実行すると みることができます。)に実行させることに なります。その他にも #!/usr/local/bin/perl と書くとインタプリタ型の言語 perl に実行させる perl スクリプトであることを意味します。

2行目以降はコマンドラインから入力するのと 同じコマンドリストです。

このように シェルスクリプトは非常に簡単な 構文で書くことができます。 以下、いくつか例を見ていきましょう。

先頭行は基本的に省略し、スクリプトファイル名は Script であるとします。


例 1

dvi2ps $1 |lpr -Psp2

これは、Script filename.dvi とすることでプリンタsp2 に 打ち出すものです。 $1 は引数(コマンドに与える パラメータ)の1番めを表します。 これだと、たとえば次のように
$ Script filename -f 1 -t 15
と他のパラメータをつけても -f 1 -t 15 は意味を 持ちません。(因みにこのオプションは、dvi2psのオプションで 1ページから15ページまでポストスクリプトに変換するというものです。) これを期待通り動かしたければ Script を次のように変更します。
dvi2ps $* |lpr -Psp2
ここで、$* は引数のすべてで その部分を置き換えることを意味し、 結局、上記のようにやると dvi2ps filename -f 1 -t 15 |lpr -Psp2 が実行されることになります。
例 2

if [ `hostname` = smaux ]; then
    echo Host is smaux. This is one of the jservers.
elif [ `hostname` = diana ]; then
    echo Host is diana. Mathematica can run.
else
    echo Host is `hostname`. No comment.
fi

まず、 if list1 then list1e [ elif list2 then list2e ] ... [ else list3 ] fi について。これは list1 という条件が真ならば list1eを実行し、そうでなくてかつ list2 が真ならば、list2e を実行し、 そして、最後にどの if/elif にも引っかからなかったら list3 を実行せよ、というものです。 ここで、[] に囲まれた部分はなくても構わないものです。 つまり、もっとも簡単な if 文は if list1 then list1e fiです。 つぎに、`command` は コマンド command を実行して、その結果を返すというものです。 つまり、`hostname` は、コマンド hostname を実行して、 その結果を値にもつものです。したがって、
if [ `hostname` = smaux ] 
hostname を実行した結果が smaux ならば、 という意味です。
    echo Host is smaux. This is one of the jservers.
これは、単に "Host is .... vers." というメッセージを 画面に表示するというものです。 そして、最後に、smaux でも kinkaku でもなければ、 No comment.と表示するというわけです。
以上、非常に簡単な例ですが、これを参考にいろいろな スクリプトを書いてみることをお勧めします。 スクリプトで使えるコマンドは sh のマニュアルを見ることで知ることができます。 また、
#!/usr/local/bin/zsh
で始まるスクリプトの時には、zsh 特有の 関数が使えたりします。
例 3
#!/usr/local/bin/zsh
a=$[RANDOM % 10]

case $a in
0) ...
1) ...
......
9) ...
esac

これは、乱数を生成してそのあまりで場合わけをするものです。

yositomi@kusm.kyoto-u.ac.jp