解説

シェルプログラミング入門

米 野 誠l1 はじめにr

シェル (shell)はユーザと UNIXカーネル (kernel)との仲介を行なうコマンドインタープリタ（コマンド解釈プログラム）である．ユーザが入力したコマンドは，このシェルによって，解釈処理を行ない，最終的にカーネルに引き渡し，コマンドが実際に実行される．また，実行結果に何らかの出力がある場合は，カーネルからシェルに渡され，画面やファイルに出力される．このよ
うに，シェルが仲介を行なっていることによって，コマンドの起動はもちろんのこと，メタキャラクタの解釈 (ls*.
Cなど），パイプやリダイレクトによる入出力の切替えなどを行なうことができる．
シェルに一連のコマンドをまとめて与えるには，適当なファイルに一連のコマンドを羅列し，そのファイル名をコマンドとして入力するとよい．このファイルをシェルスクリプトといい，UNIXのコマンドはもちろんのこと，条件判断や繰り返しといった基本的な制御を行なわせることもできる．本稿では，代表的なシェルとして標準シェル (Bourneshell)と，これを拡張させた Cシェ

Cshell)を使ったプログラミング方法について説明する．
ル(r 2 標準シェル2.
1 スクリプトの書き方
標準シェルは，S.
R.
Bourne氏によって開発された UNIX標準のシェルである．標準シェルでのシェルスクリプトを記述するには，次の 2点に注意する必要がある．

•シェルスクリプトの先頭（ファイルの先頭）は＃！／ bin/sh と表記する•シェルスクリプトを実行するには chmod +xfile̲
nameで実行権を与える．

なお，シェルスクリプト中の注釈は，行頭に＃をつけるとよい．

1情報科学センター，

komeno@isct.
kyutech.
ac.
jp‑11‑｝凶江業大学・情報科学センター
広 報 第 5サ 1992.
10

解説2.
2 変数と定数プログラミングfi語と同様，標準シェルでも変数に値・文字列を代入することができる．シェlanlcというシェル変数には，英文字，アンダースコアを指定することが可能である．例えば， likoという文字列（データ）と代入したい場合は，ル変数に hname=hiko＄を使う．

nameの内容を表示させるには，

echo $nameとすればよい．

echoとは，入力した文字をそのままエコーバックして画面表示するコマンドで︒とする．また，定数の置換を行なう場合は，ある．また，シェル変数の中には特別な値が代入される変数もある．

$$ PID（プロセス ID) PIDが代入される＄〇

プログラム名プログラム名が代入される＄＊引数

コマンド行に入力された全ての引数

2.
3 入出力
データの入力は，引数・シェルコマンド (read または，line)を使って行なう．例えば，シェルスクリプト (exOl)を次のようにして実行した場合

シェルスクリプト exOlは，引数として 2つのデータをシェル変数に代入している．引数をスクリプト中で利用するには，＄マークの次に引数の番号を書く．引数が 1つの場合は＄ 1となり，上記の例では mdatalがその内容となる．
また，シェルコマンドの read または，lineとは，一行の文字列を読み込むコマンドである．

このコマンドを使って，指定したシェル変数に文字列（データ）を読み込むことができる．

echo)を使うとよい．もちろ
シェル裟数の内容を表示するには，標準出力に出力するコマンド (んリダイレクトを使って結果を 7 ァイルに保存することもできる．

2.4 基本制御
シェルスクリプトでも，通常のプログラミング言語と同じように条件判断や繰り返し処理を行なうことができる．標準シェルで使用可能な基本制御文を以下に示す．

.if文
・w
hile文
・case文

・・・

条件判断を行なう

・・・

一定回数処理を繰り返す・・・

多分岐判断を行なう

・for文

・・・

一定回数の処理を繰り返す（繰り返し変数に文字列を使用する）

九州上巣大学・情報科学センター
広 報 第 5号 1
992.I
O‑‑12‑︒

ex01mdata1 mdata2解説

なお，if,
while文は，終了条件として条件評価コマンド (test)を併用する．その testコマンドをまず説明しておく．

testコマンドの一般の書式は， test expressionとなっている．ここで expressionは，条件式のことである．結呆が真であると 0を返し，偽であると 1を返す．
満足した場合には 0を返す．
tring
1は string2と同じである．
string1 string2 s＝ stringz string1は string2と同じでない．
string廿stringはヌルである．
string演算子=

なお，変数を数値的に比べる場合の評価も存在するが，ここでは説明を省く．

r2.
4.
1 if文
if文の書式を以下に示す．まず，条件式として command‑testが実行される．これは，前に述
estコマンドを使う．この条件が真であれば commandを実行する．そうでなければスキッ
べた tプされる．

if command‑test
thencommandl
command2command(n)
fi

r
̀

また，

elseが入った書式は次のようになる．

if command‑test thencommand1corn
mand2
else
command3
command(n)fi例1)if文の使い方
以下の例では，read文でシェル変数 mojiに文字列を読み込む，それを if文によって判断し echo文で結果を出力している．

‑13‑

九州工業大学・情親科学センター
広 報 第5号 1
992.
10

解説

プログラム

#!/bin/sh
read moji
if test $moji = MON then echo'Today is Monday'
else echo'Today is not Monday'fi︒

実行結果% monMON
Today is Monday% monTUE
Today is not Monday%2.
4.
2 while文
w
hile文は，一定回数ループを行なうものである．このコマンドの書式は次のようになる．
while command‑testdocommand1
command2
command(n)donecommand‑testには，testコマンドを使って繰り返し条件を記述する．この時の評価値が 1であれば繰り返しを抜け，逆に 0であると do‑done間のコマンドを繰り返すことになる．

例2)whi
le文の使い方プログラム#!/bin/shi=1
while test "$i" !
=6doecho $i'i='expr $i + 1done
九州工業大学・情報科学センター
広 報 第 5号 1
992.
10

＃初期値

#iが 6になったら whileloopから脱出する#iに 1を足して，iに代入する

‑14‑

゜解説

実行結果%wa
123•以下省略・・例3)while文と read文の組み合わせ方
カレントディレクトリーにあるファイルの中身を，ファイル名をキーボードから入力することによって表示させるシェルスクリプト

r

プログラム

#!/bin/sh
while read num
docat $num
done

# file名を読み込む＃読み込んだ file名の fileの内容を表示

実行結果/0。cat1

r
ヽ

file1
........filelの内容．．．．．．
file2........file2の内容．．．．．．
file3........file3の内容．．．．．．
^C/0。
このシェルスクリプトは繰り返し条件でプログラムが終了することがないので，コントロールC を入力して強制終了させる．
2.
4.
3 case文
case文は，一つの値（入力値）と指定値とを比較して同じ場合，指定されたコマンドを実行するものである．書式は，次のようになる．

‑15‑

九州工業大学・情報科学センター
広 報 第 5号 1
992.J
O

解説

case value in1) command1
command2
command(n),,2)
command,,n) command;;esac
この場合，値 valu
eは，値 1,2,チングした行から，11 を比較して，マッチングするまで比較される．そしてマッ2つのセミコロンまでを実行して caseを終了する．

)case文の使い方
例4
プログラム

＃メニューの表示＃番号の読み込み#1を入力すると whoを実行#2を入力すると fingerを実行#1,2以外を入力すると実行を止める．

実行結果/0。sentaku
1:who 2:finger
1
komeno ttyp1
I'sentaku
1:who 2:finger．

Jul 21 13:58(hiko.isct.kyutec)

2

Loginkomeno

Name
TTY Idle
When
Where
Komeno‑Mt.man‑Makoto p1
Tue 13:58 hiko.isct.kyutec

.
1

2.
4.
4 for文
for文は，同じコマンドを指定された文字列の数だけ実行するものである．これは，一般の言語と違い，繰り返し数を指定するのでなく，変数に代入する単語数で繰り返し数を決める．書式
九州 J滉．巣大学・情毅科学センター
広 報 第 5号 1
992.10゜‑16‑︒#1/bin/shecho'1:who 2:finger'
read numcase "$num"in1) who;;
2) finger;;*) exitesac

解説は，次のようになる．

for var in lan1 lan2 lan3...lan(n)do・commandl
command2command(n)
done

値l狙1
1が ま ず 始 め に 変 数 v
arに 代 入 さ れ ， 指 定 し た コ マ ン ド が 実 行 さ れ る ． こ れ が 1
au(ll)まr

で同じ作業が続く．従って，全部で n回の処理をすることになる．
例5)fingerを使って，教育用 WSの 3台（戸畑 yuri,renge,hagi)に 誰 が logi
nしているか調べる
シェルスクリプト
プログラム#!/bin/sh
for host in yurirenge hagi
dofinger c$host#変数を hostとする．
# cは，その後に続くマシン名に＃接続されデータが出力される．

done
実行結呆I'。whoall7̀＇[yuri.isct.kyutech.ac.jp]
Login
Name
TTY Idle
When
Where
komeno Komeno‑Mt.man‑Makoto pl
Tue 14:28 hiko.isct.kyutec[renge.isct.kyutech.ac.jp]
TTY Idle
When
Where
Login
Name
pl 2:53Tue 10:31 hiko.isct.kyutec
tyamano yamanoue takashi
p2 3:36 Tue 10:32 hiko.isct.kyutec
tyamano yamanoue takashi[hagi.isct.kyutech.ac.jp]
No one logged on•K‑17‑

几州工業大学・情程科学センター
広 報 第 5号 1
992.
10解説

3 C シェル
Cシェルは，標準シェルを拡張し使いやすくしたものである．エイリアス機能やヒストリ機能など，標準シェルには備えられていない便利な機能がある．

3.
1 スクリプトの書き方
スクリプトの書き方については，標準シェルと C シェルはほとんどかわらない．ただし，シェルスクリプトの先頭には＃！／ bin/cshと記述しなければならない．

3.
2 変数と定数
標準シェルと同様に変数に値・文字列を代入することができる．シェル変数に英文字，アンダースコアを指定することは標準シェルと同じであるが，代入のイ！：方が違う．例えば，IItllllcに hiko。と代入したい場合は，

set name=hikoとする．また，定数の置換は，標準シェルと同様に，なシェル変数が存在する．そして，＄を使う．また，標準シェルと lnj様に特別C シェル特有の C シェル変数というものがある．

3.
3 入出力
C シェルでは，シェルコマンド(read)を使うことはできない．

3.
4 基本制御C シェルで使用できる基本制御文は， if,w
hile,sw
itch,foreac'.
h文の 4つである．
.if文

条件判断を行なう

・w
hile文・sw
iteh文
・foreach文

一定回数処理を繰り返す
多分岐判断を行なうi]する）
一定回数処理を繰り返す（繰り返し変数に文字列を使 J

なお，標準シェルでは testコマンドを使って条件判断を行なっていたが，C シェルでは涼算 fが存在するので testコマンドは併用しなくてよい．

3.
4.
1 if文
fは，標準シェルと同じように扱えるが endifの部分が異なるので注意されたい．書式はこの i次のようになる．
九州工業大学・情報科学センター
広 報 第 5号 1992‑10‑18‑︒

データの入出力方法は，標準シェルと同様に行なえる．ただし，

解説

Iif (expression) commandまたは，if (expression) thencommand1
else
command2

r,endifである．また，

expr
ess
ionにおいて使用できる演算子は次の通りである．この他にも，一般的な<,>, <=,>＝も使用できる．
」同[疋'= 否定＆＆論理積

11 論理和例6)if文の使い方
プログラム

r,#1/bin/csh
if($1==1) thenwho
elsefinger
1endif＃引数が 1だったら whoを実行＃引数が 1以外だったら fingerを実行

実行結果%ide 1
komeno ttyp1 Jul 30 16:23 (hiko.isct.kyutec)% ide fLogin
Name
TTY Idle
WhenWhere
komeno Komeno‑Mt man‑Makoto plThu 16:23 hiko.isct.kyutec

1例7)if文の使い方
通常のファイルであれば＇ファイルです＇と表示し，ファイルでなければ＇ファイルでありません＇と表示させるシェルスクリプト．

‑19‑

九州工業大学・情報科学センター
1
9
92
.
10

広 報 第 5号

解説

プログラム

#!/bin/csh＃引数が通常ファイルなら真if(‑f$1) thenecho ファイルですelseecho ファイルではありません＃ファイルでなければ偽endif
実行結果'/. file̲test genkou.tex
ファイルですこ0/.
file̲test test
ファイルではありません%
この例では，genkou.
t
exはファイルであるが， testはディレクトリなのでファイルでないと判断した．

3.
4.
2 while文
標準シェルの w
hile文と同じである．書式は次のようになる．

︒

while (expression)command1
command(n)end例8)while文の使い方
プログラム#!/bin/csh
set i=O
while ($i!
=5)
echo $ic i++# 5になるまでループする# iを表示# i+1を実行

end

九州工業大学・情報科学センター
広 報 第 5号 1992.1
0‑ 20‑

鮒説3.
4.
3 switch文
sw
itch文は，標準シェルの case文と同様，選択文である．書式は次のようになる．
switch (string)case lanl:commandlbreaksw
case lan2:comma.
nd2r
̀breaksw
default:
command(n)breaksw
endsw

st
r
in
gを lanに対応させる．一致していれば， breakswまでのコマンドを実行させる．もし，一致するパターンが無ければ， defaultに続くコマンドを実行させる．
例9)
sw
it
c
h文の使い方プログラム

r#!/bin/csh
switch ($argv)
case ‑e:emacs
breaksw
case ‑
n:ng
breaksw
default:
exit
breaksw
endsw＃引数が— e であれば，emacsを実行＃引数が— n であれば，ngを実行xitする．
＃引数をー e,‑n以外にすると e‑21‑

九州工業大学＇・情報科学センター
広 報 第 5号 1992.
10

解説3.
4.
4 foreach文
foreach 文は，標準シェルの fol• 文にあたる．書式は次のようになる．

foreachvar (list)
command1cornmand2
command(n)
end

これは，

listの中の単語を varの中に次々に代入して指定されたコマンドを実行する．

例10)foreac
h文の使い方プログラム#!/bin/csh
foreachfile (*) ＃ 変 数 fileにカレントディレクトリのファイルを代入する
echo $file≫ /tmp/memo$$#fileの中身を／tmp/memo$＄に追加格納する
end
cat /tmp/memo$$＃データが格納されたファイルを表示する
rm‑
f /tmp/memo$$ ＃作業ファイルを削除する

゜

実行結果C
i% ls̲echo
editorgenkou.aux
genkou.dvi
genkou.log
genkou.tex
ls̲echomonsentaku
wa
whoall%九州工業大学・情報科学センター
広 報 第 5号 1
992.I
O‑22‑

解説

4 具体的な使い方

4.
1 コンパイル用のシェルスクリプト
ここでは，言語コンバイルと実行を行なうシェルスクリプトを示しながら具体的な使い方を説明する．

Fort
ranプログラム等は，まず始めにコンパイルして，実行ファイルを作り，そしてその実行ファイル名をコマンドとして入力することで，はじめてプログラムが実行可能となる．この流れをシェルスクリプトのファイルに上から順に記述するとよい．そうすると，．ーごつの仕事が一度にできることになる．次に例を示す．

r1)二つの数を入力して，その和を出力する F
ort
ranプログラム samplr.fを使い， 7ァイル
例117し］）＇nt.
dataから二つの数を入力し，その和をファイル output.
dat
aに出力するシェルスクリプト．
プログラム#!/bin/sh
f77 ‑o sample sample.f#sample.fをコンバイルする
sample< input.data> output.data＃実行ファイル sampleを実行し， input.dataからデータ入力し，#output.dataに出力

実行結果

r

% chmod +x fort
% fortsample.f:MAIN:% cat output.data
7.00000
a+b=o!
.

こんな，シェルプログラムも作れる．

#!/bin/sh
A
=sa
r
nple
B=input.data
C=output.data
f77 ‑o $A $A.f$A< $B > $C
このプログラムでは，ファイル指定をしている A,B,Cを書き換えることによってソースファイ
ルプログラム，入カデーターファイル，出カデータファイルを変更することができる．

‑23‑

九州工業大学・情報科学センター
広 報 第 5号 1
992.10解説例12)0,5,6番以外の装置番号を使用したプログラムと，そのコンパイル，ファイルの割り当ておよび実行を行なうシェルスクリプト．
プログラム︒#!/bin/sh
f77 ‑o sample sample.fln‑s input.data fort.10ln ‑s output.data fort.11
samplerm ‑f fort.10
rm‑
ff
ort
.1
1
実行結果

'/
4 fort2
sample.f:
MAIN:

'!
.
cat output.data
a+b=7.00000
'!
.
ここで，

ln ‑
sinput.dat fort.10とは， input.
dat
aを fort.
10として使うために，リンクをしたわけである．次の行も同じ意味である．

4.
2 .cshrcによる環境設定の例というファイルに書き込むコマンドを紹介する．なお，これは，シェルプログラムのファイルでshrcの中に，ある．現在，情報科学センターでは標準環境を設定するために各ユーザの． csource /usr/local/isc/defaults/cshrcと書き込んでいる．これは，環境設定を source以下のファイルでまかなっているということである．

sr/local/isc/de
f
ault
s/c
shrcの中身を覗くと，次に示すようなスクリプトになっている．
この／u
ここでは，この中で ali邸コマンド，

setコマンド， setenvコマンド， limitコマンド， llllla.
skコ

マンドについて説明をする．

九州工業大学・情報科学センター広 報 第 5号 1
992
.10‑ 24‑o

ここでは，ログイン時に環境設定等を自動的にするために環境設定コマンド等を書き込む． cshrc解説set
path= (/usr/lang /usr/ucb /usr/bin ¥/usr/local/bin /usr/local/X11R5/bin /usr/openwin/bin ¥/usr/openwin/bin/xview /usr/local/bin/Wnn4 /usr/local/bin/mh ¥/usr/ext/bin /edu/bin ‑/bin.)limit coredumpsize 0 kbytes
umask 022
if(! $7prompt) exit
set
setsetr I

setsetset

filec
ignoreeof
noclobberhistory= 100
notifyprompt= "'whoami'%"setenv JSERVER'hostname'setenv LANG japanesesetenv MANPATH'/usr/lang/man:/usr/man:/usr/local/man: ¥/usr/local/X11R5/man:/usr/openwin/man:/usr/ext/man'setenv EDITOR emacs
setenv PAGER lessalias uurnalias pwd

'uum ‑u ‑U ‑D$JSERVER''echo $cwd'

4.
2.
1 aliasコマンドr｀

これば，別名機能である．エリアスと普通読むが，ユーザによってはアリアス，アライアスと発音する人もいる．この別名の設定は，

alias新設定コマンド本来のコマンドである．例えば，

dirを lsと同じにするには次のようにすればよい．

alias dir'ls ‑1'また，途中で設定を止めたくなることがある時は，

unaliasコマンドを使う．

unalias dir‑25‑

九州工業大学・情報科学センタ
広 報 第 5号 1992.10

解説

4.
2.
2 setコマンド
これは，変数の殷巫などでも使われるものである．この．（•slm· で設定される sけの次の車．語はシェル変数である．

path
filec

コマンドを探す対象となるデイレクトリーを設定する．
これを設定するとファイルの先行する文字列を人力して ESCを人）jすると一致する
範囲最大で置き換える

ブがあるときに有効

4.
2.
3 setenvコマンド︒

1g
1
1oreeof コントロール Dで終了するのを防ぐ
nodobber 存在するファイルに出カリダイレクトをしないようにする．
これを設定するとジョブが終了するとシェルが知らせる．バックグラウンドジョ
notify

Cシェルの環境変数は， setenvで設定される．ただし，この環境変数を設定する時にはイコール記号は使えない．

setenv VAR wordという書式を持つ．これは，環境変数 VARに1直wordが設定される．ここで使用されている環境変数の意味は次の通りである．

JSERVER

漢字変換をするサーバー

LANG
使用言語
MANPATH オンラインマニュアルを実行した時にマニュア）レを探す対象

EDITOR

エディター指定

PAGER

ページャ指定4.
2.
4 limitコマンド
limitは，limit の次に来るソースの量の制限をする．この (•shrc の例では，‘ノースが (•orcclullll)_

izrとなっている．これは，コアファイルの大きさを決める． eoreclumpsizeの次は，指定ソース

泣kbitesということになる．
ファイルの最大許容量である．この場合は，コアファイルの大きさは O
4.
2.
5 umaskコマンド
uma.
c;
kは，作成マスクを設定する．この指定される数字は 8進数である．これは，新規ファイル・新規ディレクトリーに対しての許可を与えるもので，022とは，自分以外のユーザにも読み77にすると，自分以外のユーザは読み込む込み許可を与えるということである．ここの数字を 0ことは不可能となる．これは，umask 077' を実行すればよい．

5 おわりに今回は，シェルプログラムの基本を説明した．なお，引用符・正規表現等，シェルの特殊な表
現の説明は省いたので市販の本を参考にされたい．

九州工業大学・情報科学センター
広 報 第 5号

1992.10‑26‑

゜