シェル・スクリプト - IPLAB

シェル・スクリプト
理工学研究科 013371 清土桂一郎
○概要
Unix で用いるコマンドを、同じ命令形式で記述しファイルに格納・実行する事により、
連続した命令実行が可能なる。ここで用いるプログラミング言語がシェルプログラミング
言語である。シェルプログラミング言語は、単なるコマンド言語だけではなく、ループ処
理や条件判断などの機能も備えているため、C や Fortran といった言語で作成するプログ
ラムと同じ働きをするプログラムを作る事が可能である。このシェルプログラミング言語
を用いて作成したファイルをシェル・スクリプトと呼ぶ。また、言語の書式自体をシェル・
スクリプトとも呼ぶ。
○シェルとは?
シェルとは、UNIX のシステムとコンピュータを操作する人間(ユーザ)との仲立ちをす
るプログラムで、ユーザーが入力したコマンドを理解し、システムへと送る役割を担って
いる。
U
ユーザーA
シェル
N
シェル
I
X
シェル
ユーザーB
ユーザーC
シェルは一つの独立したプログラムで、ユーザーがログインしてログアウトするまで起
動しているものです。いくつかの種類があり、ユーザーが必要に応じてその種類を選択す
る事も可能で、カスタマイズすることも可能です。ユーザーごとにそれぞれシェルが起動
する。
この状態は、一般的な UNIX でのログイン画面です。ここでユーザーがログインすると、
シェル(画面は tcsh)が起動し、コマンド待ちの状態になる。(コマンド・プロンプト)こ
の状態で、UNIX の内部コマンド(ls や cd)や外部のプログラム起動を入力する事で、シ
ェルがそのコマンドを理解し、プログラムを実行するように UNIX システムに命令をだす。
このようにシェルは、コマンド・インタープリタとしての性質を持つが、この他にプログ
ラム言語的性質も持っている。シェル・スクリプトで記述されたファイルを実行する事で
シェルは、その内容を理解し、命令を UNIX に送る。これによって、プログラムの連続実
行や条件判断、繰り返しなどの処理を行えるようになる。
○シェルの代表的な種類と歴史
・Bourne シェル(B シェル):UNIXシステムの標準シェル
・Korn シェル(K シェル):Bシェルにはないコマンドの別名やヒストリー機能を備え、
さらにBシェルと互換性のあるシェル
・C シェル:Bシェルにはないコマンドの別名やヒストリー機能を備えたシェル
UNIX は AT&T の Dennis Ritchie と Ken Thompson によって 1969 年に生み出された。
このとき、システムとユーザーが対話できるようにする方法を作り出そうと考えた。その
後、この考えから生み出されたものが Bourne シェル(sh)である。Bourne シェル(B シ
ェル)が作られてからは、C シェル (csh)や Korn シェル(ksh)など、他のシェルも開
発された。C シェルは sh の改良版として、カリフォルニア大学バークレー校で開発 され
たもので、UNIX のベース言語である C 言語を用いるため、高機能であるが実行速度が遅
いという欠点があった。Korn シェルは AT&T が1988年、 Bourne シェルとCシェル
の長所を 取り混ぜ生み出されたものである。また、Bourne シェルに最新の機能を追加し
登場したのが Bourne Again シェル(bash)で、Linux で良く利用されている。
B シェル系
(改良版)bash
AT&T 開発系
C シェル系
K シェル
(改良版)tcsh
バークレー校開発系
シェル・スクリプト
簡単なプログラム例
1.条件分岐(現在時刻に合わせたコメント表示)
#! /usr/local/bin/sh/
#! /usr/local/bin/tcsh
①
set `date`
hour=`echo $2 | cut -c1-2`
set d=`date`
set hour=`echo $d[2] | cut -c1-2`
②
if ( $hour < 12 ) then
echo "Good morning!"
if [ $hour -le 12 ]
then
echo "Good morning!"
elif [ $hour -le 18 ]
then
echo "Hello!"
else
echo "Good evening!"
fi
exit 0
③
else if ( $hour < 18 ) then
echo "Hello!"
else
echo "Good evening!"
endif
④
exit 0
B シェル例
C シェル例
①このプログラムを実行するシェルを定義
②UNIX コマンド’date’の実行結果を、変数に代入。B シェルの場合は特殊変数に代入し
たことになる。それぞれ、代入値から不要な文字を取り除いたものを、変数 hour に代
入している。$2 および$d[2]はそれぞれ変数の引数。→特殊変数
③比較演算子
等しい
異なる
より大きい
B シェル
-eq
-ne
-gt
C シェル
==
!=
>
以上
未満
以下
B シェル
-ge
-lt
-le
C シェル
>=
<
<=
④それぞれ if 文を fi,endif で閉じている。
実行例:15 時の場合
B シェル例の場合、特殊変数$0 にはスプリクト
ファイル名、$1 には「2002 年 09 月 19 日(木)」、
> greeting_b.txt
$2 には「15 時 00 分 56 秒 JST」が代入された。
Hello!
C シェル例では、変数 d の引数 1,2 にそれぞれ
>
同様に値が代入された事になる。
2.ファイルの読み込み・算術(カウンター)
#! /usr/local/bin/tcsh
C シェル例
set file_name=counter.dat
if (-e $file_name) then
①
set counter = `cat < $file_name`
②
@ counter=$counter + 1
echo $counter"回目のログインです。"
③
rm -f $file_name
echo $counter > $file_name
④
else
echo "データファイルが存在しません。"
endif
#実行例:
> counter.txt
38 回目のログインです。
>
①ファイルの存在を確認。
-r
-w
-e
読み出し可能か?
書き込み可能か?
存在しているか?
-x
-z
-s
実行可能か?
サイズは0か?
サイズは 0 ではないか?
②ファイルが存在する時に、ファイルの内容を変数 counter に代入する。入力リダイレ
クション。
③算術記述:C シェルの場合は @ X=$X + 1、B シェルの場合は expr X=$X + 1
算術記号(+,-,*,/)の前後はスペースが必要。連続している場合は文字列として扱われ
ます。
④計算結果をファイルに書き込む。(ファイルを生成:出力リダイレクション)
入出力リダイレクション
コマンドの実行結果を、表示するのではなくファイルに出力するものが出力
リダイレクションで「コマンド > ファイル名」が新規作成、上書きとなり
「コマンド >> ファイル名」が追加書き込みとなる。たとえば「ls > ファ
イル名」とすると、リストの結果がファイルに記録される。